Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Loops for循环中变量的作用域_Loops_Go_Scope - Fatal编程技术网

Loops for循环中变量的作用域

Loops for循环中变量的作用域,loops,go,scope,Loops,Go,Scope,下面的程序处理两个数组。除了注意到阵列tmp逐渐变小之外,该算法没有什么重要性 package main import ( "strings" "fmt" ) func arrayToString(a []int, delim string) string { return strings.Trim(strings.Replace(fmt.Sprint(a), " ", delim, -1), "[]") } func numSeries(arr []int) ([

下面的程序处理两个数组。除了注意到阵列tmp逐渐变小之外,该算法没有什么重要性

package main

import (
    "strings"
    "fmt"
)

func arrayToString(a []int, delim string) string {
    return strings.Trim(strings.Replace(fmt.Sprint(a), " ", delim, -1), "[]")
}

func numSeries(arr []int) ([]int, []int) {
    return arr[:2], arr[2:]
}

func main() {
    highnum := []int{8,7}
    tmp := []int{6,5,4,3,2,1}
    curr := []int{}
//    fRight := ""
    for i, v := range highnum {
        curr, tmp = numSeries(tmp)
        fmt.Printf("v %d numSeries result curr %s tmp %s\n", v, arrayToString(curr, ", " ), arrayToString(tmp, ", " ) )
        fmt.Printf("final (1) %s\n", arrayToString(tmp, ", " ) )       
//        fRight += "[" + arrayToString(append(curr, v), ", ") + "]"
        if i == len(highnum)-1 {
            fmt.Printf("final (2) %s\n", arrayToString(tmp, ", " ) )
        }
//        fmt.Printf("fRight |%s|\n", fRight)        

    }
}
结果是:

v 8 numSeries result curr 6, 5 tmp 4, 3, 2, 1
final (1) 4, 3, 2, 1
v 7 numSeries result curr 4, 3 tmp 2, 1
final (1) 2, 1
final (2) 2, 1
程序运行-输出中的最终(1)和最终(2)注释具有相同的值。然而,如果我取消注释上面三条注释掉的语句,我会得到一个错误的结果。这是错误的程序和结果

package main

import (
    "strings"
    "fmt"
)

func arrayToString(a []int, delim string) string {
    return strings.Trim(strings.Replace(fmt.Sprint(a), " ", delim, -1), "[]")
}

func numSeries(arr []int) ([]int, []int) {
    return arr[:2], arr[2:]
}

func main() {
    highnum := []int{8,7}
    tmp := []int{6,5,4,3,2,1}
    curr := []int{}
    fRight := ""
    for i, v := range highnum {
        curr, tmp = numSeries(tmp)
        fmt.Printf("v %d numSeries result curr %s tmp %s\n", v, arrayToString(curr, ", " ), arrayToString(tmp, ", " ) )
        fmt.Printf("final (1) %s\n", arrayToString(tmp, ", " ) )       
        fRight += "[" + arrayToString(append(curr, v), ", ") + "]"
        if i == len(highnum)-1 {
            fmt.Printf("final (2) %s\n", arrayToString(tmp, ", " ) )
        }
        fmt.Printf("fRight |%s|\n", fRight)        

    }
}
结果:

v 8 numSeries result curr 6, 5 tmp 4, 3, 2, 1
final (1) 4, 3, 2, 1
fRight |[6, 5, 8]|
v 7 numSeries result curr 8, 3 tmp 2, 1
final (1) 2, 1
final (2) 7, 1
fRight |[6, 5, 8][8, 3, 7]|
请注意,最终(1)和最终(2)注释具有不同的值。这是错误的。我怀疑这种行为是完全正确的,我喜欢初学者的“明白了”。如果有人能指出一个现有的StackOverflow问题,给出一个解决方案,或者描述正在发生的事情,我将不胜感激。我特别高兴地看到有关这一问题的官方语言定义的参考资料。

在这里:

fRight += "[" + arrayToString(append(curr, v), ", ") + "]"

特别是,
追加
。这里的关键是切片是数组上的视图。
curr
tmp
指向相同的底层数组,
curr
是它的开始部分,
tmp
是它的结束部分。
append
的工作方式是,如果片有足够的容量,它只需将元素添加到片的末尾,并增加
len
。当您运行
append
时,
curr
具有足够的容量,因此
v
被添加到
curr
的末尾,这恰好是
tmp
的第一个元素。所以你可以覆盖这个元素。

学习这个理论是一回事,在现实世界中实际使用它又是另一回事。对我个人来说,这是一个很好的教训。