Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎么能不在go中重新分配变量?_Go - Fatal编程技术网

我怎么能不在go中重新分配变量?

我怎么能不在go中重新分配变量?,go,Go,我不明白如何在go中适当地重新分配块范围中的变量 包干管 进口 fmt 路径/文件路径 func main{ 基数:=/a/b/c 其他:=/a/b/c/d/e 为基础!=其他{ other,file:=filepath.Splitother//other已声明但未使用 fmt.Printlnfile } } 我想使用filepath.Split的两个部分,所以我需要:=,因为文件尚未声明。我希望other越来越短,所以我重新分配了filepath.Split的结果,但是go编译器不允许我运行这

我不明白如何在go中适当地重新分配块范围中的变量

包干管 进口 fmt 路径/文件路径 func main{ 基数:=/a/b/c 其他:=/a/b/c/d/e 为基础!=其他{ other,file:=filepath.Splitother//other已声明但未使用 fmt.Printlnfile } } 我想使用filepath.Split的两个部分,所以我需要:=,因为文件尚未声明。我希望other越来越短,所以我重新分配了filepath.Split的结果,但是go编译器不允许我运行这段代码


为什么会是这种情况,我应该如何做这类事情?

循环体是另一个块,因此在其中使用短变量声明将不会使用之前在循环外部声明的另一个变量,而是将创建一个新的另一个变量,其作用域为循环体块。鉴于此,第二个其他变量不会在任何地方使用,因为base!=循环中的其他条件引用外部其他变量,因此产生编译时错误

首先创建预期的第二个变量,并使用simple而不是:

请注意,上面的代码将运行到一个无休止的循环中,因为后面的斜杠保留在other中,所以在下一次迭代文件路径中。Split将返回相同的other,最后一个dir将不会被切断,并且不会再次更改

要使代码实现所需的功能,必须将尾部斜杠切掉,如下所示:

for base != other {
    var file string
    other, file = filepath.Split(other) // "other declared but not used"
    fmt.Println(file)
    if strings.HasSuffix(other, "/") {
        other = other[:len(other)-1]
    }
}
base := "/a/b/c"
other := "/a/b/c/d/e"

for base != other {
    fmt.Println(filepath.Base(other))
    other = filepath.Dir(other)
}
现在将运行此命令并在以下服务器上尝试输出:

请注意,如果使用filepath.Base获取路径的最后一部分和父文件夹,则使用更简单的代码也可以实现同样的效果,如下所示:

for base != other {
    var file string
    other, file = filepath.Split(other) // "other declared but not used"
    fmt.Println(file)
    if strings.HasSuffix(other, "/") {
        other = other[:len(other)-1]
    }
}
base := "/a/b/c"
other := "/a/b/c/d/e"

for base != other {
    fmt.Println(filepath.Base(other))
    other = filepath.Dir(other)
}
这输出相同,请在上尝试

见相关问题:


行得通,谢谢。但是为什么我不能在这里使用短变量声明?@samuelstevens添加了更多解释,修复了代码,并展示了一个更简单的替代方案。循环体是另一个块,因此在其中使用短变量声明不会使用之前在循环外声明的另一个变量,但将创建一个新的其他变量,作用域为主体块。鉴于此,第二个其他变量不会在任何地方使用,因为base!=循环中的其他条件引用外部其他变量,因此产生编译时错误。这是有道理的。它是否记录在某个地方,或者只是我应该知道的Go的一部分?是的,它被记录了::与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初在同一块或参数列表中声明,如果该块是具有相同类型的函数体,并且至少有一个非空白变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不会引入新变量;它只是将一个新值赋给原始值。