DeepEqual 以不同方式对待用反勾初始化的数组?
DeepEqual treats array initialized with back tick differently?
我的问题很简单,我用back tick初始化一个字符串数组,但是我发现golang对这个数组的处理方式不同:
import (
"fmt"
"reflect"
)
func main() {
x := []string{`hello world`, "me"}
y := []string{"hello", "world", "me"}
fmt.Println(x)
fmt.Println(y)
fmt.Println(reflect.DeepEqual(x, y))
}
输出为:
[hello world me]
[hello world me]
false
这让我很困惑:我应该确保所有字符串数组都以相同的方式启动吗?
它们是 slices, not arrays,你的第一个切片有 2 个元素,第二个切片有 3 个元素,所以它们怎么可能相等?
尝试像这样打印它们:
fmt.Printf("%d %q\n", len(x), x)
fmt.Printf("%d %q\n", len(y), y)
输出:
2 ["hello world" "me"]
3 ["hello" "world" "me"]
fmt.Prinln()
将打印传递的切片的所有值,在元素之间打印 space。 x
的第一个元素是一个字符串,它等于 y
的前 2 个元素加上 space,这就是为什么你看到切片的打印内容相等。
当您使用相同的 3 个字符串来初始化带有反引号的第一个切片时,它们将相等:
x = []string{`hello`, `world`, "me"}
y = []string{"hello", "world", "me"}
fmt.Printf("%d %q\n", len(x), x)
fmt.Printf("%d %q\n", len(y), y)
fmt.Println(reflect.DeepEqual(x, y))
输出:
3 ["hello" "world" "me"]
3 ["hello" "world" "me"]
true
在 Go Playground 上试试这些。
我的问题很简单,我用back tick初始化一个字符串数组,但是我发现golang对这个数组的处理方式不同:
import (
"fmt"
"reflect"
)
func main() {
x := []string{`hello world`, "me"}
y := []string{"hello", "world", "me"}
fmt.Println(x)
fmt.Println(y)
fmt.Println(reflect.DeepEqual(x, y))
}
输出为:
[hello world me]
[hello world me]
false
这让我很困惑:我应该确保所有字符串数组都以相同的方式启动吗?
它们是 slices, not arrays,你的第一个切片有 2 个元素,第二个切片有 3 个元素,所以它们怎么可能相等?
尝试像这样打印它们:
fmt.Printf("%d %q\n", len(x), x)
fmt.Printf("%d %q\n", len(y), y)
输出:
2 ["hello world" "me"]
3 ["hello" "world" "me"]
fmt.Prinln()
将打印传递的切片的所有值,在元素之间打印 space。 x
的第一个元素是一个字符串,它等于 y
的前 2 个元素加上 space,这就是为什么你看到切片的打印内容相等。
当您使用相同的 3 个字符串来初始化带有反引号的第一个切片时,它们将相等:
x = []string{`hello`, `world`, "me"}
y = []string{"hello", "world", "me"}
fmt.Printf("%d %q\n", len(x), x)
fmt.Printf("%d %q\n", len(y), y)
fmt.Println(reflect.DeepEqual(x, y))
输出:
3 ["hello" "world" "me"]
3 ["hello" "world" "me"]
true
在 Go Playground 上试试这些。