Golang中为什么targetPositions无法传递到内部循环?

Golang中为什么targetPositions无法传递到内部循环? 我还没有尝试编译。我还在整理代码。这只是VSCode在找麻烦吗?当我鼠标悬停时,它显示变量未定义。文本是匹配的;拼写上没有细微差别。

没关系。我搞明白了。变量 targetPositions 只存在于我调用的函数所属的一个代码块中,类似于 Rust 中的所有权概念。我之前没有理解这一点。

targpos


更多关于Golang中为什么targetPositions无法传递到内部循环?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

我喜欢 if x, ok := func(); !ok { 这种写法。

因为它能节省代码行数。可惜的是,需要预先声明这一点让它变得不那么实用。

:= 非常方便,但也有些棘手。我希望规则是:如果变量未定义,就创建它。

可能为时已晚。

更多关于Golang中为什么targetPositions无法传递到内部循环?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


targetPositionsok 是 if 代码块作用域内的局部变量。如果你希望在其他地方也能使用它们,请在 if 语句之前声明它们。

targetPositions, ok := ...
if !ok {
}

// 此处可以访问 targetPositions

另请参阅 Go 语言之旅

由该语句声明的变量其作用域仅在 if 语句结束之前有效。

在Go中,变量作用域是导致这个问题的关键原因。targetPositions 在外部代码块中声明,但在内部循环中无法访问,这是因为Go的块级作用域规则。

示例代码说明:

package main

func main() {
    // 外部代码块
    if true {
        targetPositions := []int{1, 2, 3} // 这个变量只在这个if块内有效
        
        for i := 0; i < 5; i++ {
            // 这里无法访问 targetPositions
            // _ = targetPositions // 编译错误:undefined: targetPositions
        }
    }
    
    // 这里也无法访问 targetPositions
    // _ = targetPositions // 编译错误:undefined: targetPositions
}

正确的做法是在更外层的作用域声明变量:

package main

func main() {
    targetPositions := []int{1, 2, 3} // 在main函数作用域内声明
    
    if true {
        for i := 0; i < 5; i++ {
            // 现在可以正常访问
            _ = targetPositions[i%len(targetPositions)]
        }
    }
    
    // 这里也可以访问
    _ = targetPositions
}

或者使用闭包:

package main

func main() {
    if true {
        targetPositions := []int{1, 2, 3}
        
        // 使用立即执行函数
        func() {
            for i := 0; i < 5; i++ {
                _ = targetPositions[i%len(targetPositions)]
            }
        }()
    }
}

在Go中,每个 {} 都创建一个新的作用域。内部作用域可以访问外部作用域的变量,但外部作用域不能访问内部作用域的变量。这与Rust的所有权概念不同,纯粹是作用域的问题。

回到顶部