李恒道 发表于 2023-3-12 16:08:41

golang 初始化指针切片

原文
https://stackoverflow.com/questions/45639721/golang-anonymous-struct-in-initializing-slice-of-pointers
# 正文
在 GOPL 第 7 章(第 7.6 节)中,我注意到了这一行:
```go
var tracks = []*Track{
   {"Go", "Delilah", "From the Roots Up", 2012, length("3m38s")},
   {"Go", "Moby", "Moby", 1992, length("3m37s")},
   {"Go Ahead", "Alicia Keys", "As I Am", 2007, length("4m36s")},
   {"Ready 2 Go", "Martin Solveig", "Smash", 2011, length("4m24s")},
}
```
我对他如何初始化Track的指针切片感到困惑,所以我尝试了如下示例
```go
type Ex struct {
    A, B int
}

a := []Ex{Ex{1, 2}, Ex{3, 4}}
b := []Ex{{1, 2}, {3, 4}}
c := []*Ex{&Ex{1, 2}, &Ex{3, 4}}
d := []*Ex{{1, 2}, {3, 4}}
e := []*Ex{{1, 2}, &Ex{3, 4}}
```
我发现所有的五个案例都没有错误,{1,2}似乎是一个匿名结构,但让我感到困惑,因为即使我试图填写Ex指针而不是Ex结构,他也可以正常工作
此外,当我尝试一下代码的时候,它会提示语法错误
```go
f := []*Ex{&{1, 2}, &{3, 4}} // Syntax Error!
```
有人可以帮助解释这些情况下实际发生的情况吗
# 解答
我认为匿名在这里是错误的,该结构具有一个名称“Track”或“Ex”,并且你正在使用快速初始化来初始化
```go
f := []<type>{{...}, {...}}
```
与以下内容大致相同:
```go
f := []<type>{<type>{...}, <type>{...}}
```
他比盲目的进行字符串替换只能许多,如果是一个type的指针,它也可以正确初始化
```go
f := []*<type>{{...}, {...}} // is the same as...
f := []*<type>{&<type>{...}, &<type>{...}}
```
并且他对map的作用相同
```go
f := map*<type>{"a": {...}, "b": {...}} // is the same as...
f := map*<type>{"a": &<type>{...}, "b": &<type>{...}}
```

啊麟 发表于 2023-3-12 16:48:49

哥哥学慢点吧,我赶不上了

王一之 发表于 2023-3-13 09:35:37

换了个头像不认识了

王一之 发表于 2023-3-13 09:35:58

简单来说,就是语法糖
页: [1]
查看完整版本: golang 初始化指针切片