go version: go1.17.3 linux/amd64
package main
import (
"fmt"
)
// 注意 Row 的字段是指针类型
type Row struct {
Id *int
Open *bool
}
type Source struct {
Id int
Open bool
}
func main() {
sourceList := []Source{
{Id: 1, Open: true},
{Id: 2, Open: false},
}
var rows []Row
for _, v := range sourceList {
fmt.Println("sourceList.v:")
fmt.Printf(" &v.%%p: %p\n", &v)
fmt.Println(" &v:", &v)
fmt.Println(" v:", v)
fmt.Println(" &v.Id:", &v.Id)
fmt.Println(" v.Id:", v.Id)
fmt.Println(" &v.Open:", &v.Open)
fmt.Println(" v.Open:", v.Open)
rows = append(rows, Row{Id: &v.Id, Open: &v.Open})
}
fmt.Println("\nrows, len", rows, len(rows))
for _, v := range rows {
fmt.Println("rows.v:")
fmt.Printf(" &v.%%p: %p\n", &v)
fmt.Println(" v.Id:", v.Id)
fmt.Println(" *v.Id:", *v.Id)
fmt.Println(" v.Open:", v.Open)
fmt.Println(" *v.Open:", *v.Open)
}
}
先不看下面的答案,猜猜 rows 的结果是什么?
先不看下面的答案,猜猜 rows 的结果是什么?
先不看下面的答案,猜猜 rows 的结果是什么?
答案揭晓:
sourceList.v:
&v.%p: 0xc0000aa000
&v: &{1 true}
v: {1 true}
&v.Id: 0xc0000aa000
v.Id: 1
&v.Open: 0xc0000aa008
v.Open: true
sourceList.v:
&v.%p: 0xc0000aa000
&v: &{2 false}
v: {2 false}
&v.Id: 0xc0000aa000
v.Id: 2
&v.Open: 0xc0000aa008
v.Open: false
rows, len [{0xc0000aa000 0xc0000aa008} {0xc0000aa000 0xc0000aa008}] 2
rows.v:
&v.%p: 0xc00008c240
v.Id: 0xc0000aa000
*v.Id: 2
v.Open: 0xc0000aa008
*v.Open: false
rows.v:
&v.%p: 0xc00008c240
v.Id: 0xc0000aa000
*v.Id: 2
v.Open: 0xc0000aa008
*v.Open: false
问题一:为什么 rows 两行值是一样的?(我自己有一个答案,可能是错的,先不写出来,想先问问大家的看法)
问题二:初学 Go ,请问在 struct 中用指针是不推荐的用法吗?还是我不会用?
这个用法是在某个框架中看到的,用指针可能是为了通过 if Row.Id != nil 来区分请求参数不存在(domain/path?name=x)与请求参数的值是 0 (domain/path?name=x&id=0) 的情况。
问题三:怎么区分这种参数不存在与参数值是 0 的情况?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.