DeepEqual处理使用back tick初始化的数组有何不同?

har*_*ryz 0 arrays string go slice

我的问题很简单,我使用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))
}
Run Code Online (Sandbox Code Playgroud)

输出是:

[hello world me]
[hello world me]
false
Run Code Online (Sandbox Code Playgroud)

这让我很困惑:我应该确保所有字符串数组都以相同的方式启动吗?

icz*_*cza 5

那些是切片,而不是数组,你的第一个切片有2个元素,第二个切片有3个元素,那么它们怎么能相等呢?

尝试像这样打印它们:

fmt.Printf("%d %q\n", len(x), x)
fmt.Printf("%d %q\n", len(y), y)
Run Code Online (Sandbox Code Playgroud)

输出:

2 ["hello world" "me"]
3 ["hello" "world" "me"]
Run Code Online (Sandbox Code Playgroud)

fmt.Prinln()将打印传递的切片的所有值,在元素之间打印一个空格.第一个元素x是一个字符串,它等于y用空格连接的前两个元素,这就是为什么你看到切片的相同打印内容.

当您使用相同的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))
Run Code Online (Sandbox Code Playgroud)

输出:

3 ["hello" "world" "me"]
3 ["hello" "world" "me"]
true
Run Code Online (Sandbox Code Playgroud)

试试这些吧Go Playground.