今天看代码时一直不解为什么tags本身就是个切片,为啥要传给&tags给Find
func GetTags(pageNum int, pageSize int, maps interface {}) (tags []Tag) {
db.Where(maps).Offset(pageNum).Limit(pageSize).Find(&tags)
return
}
只穿tags进去行不行?
写代码验证下:
func test(out *[]int) {
*out = make([]int, 2)
(*out)[0] = 10
(*out)[1] = 20
fmt.Printf("in test: %p\n", *out) //0x1180a0e0
}
func test1(out []int) {
out = make([]int, 2)
out[0] = 1
out[1] = 2
fmt.Printf("in test1: %p\n", out) //0x1180a0e8
}
func main() {
var s []int
fmt.Printf("addr of s: %p\n", s) //0x0
test(&s)
fmt.Printf("addr of s after test: %p\n", s) //0x1180a0e0
fmt.Printf("result=%d\n", s[1]) //result=20
var s1 []int
fmt.Printf("addr of s1: %p\n", s1) //0x0
test1(s1)
fmt.Printf("addr of s after test: %p\n", s1)
// fmt.Printf("result1=%d\n", s1[1]) //panic
fmt.Println(s1) //empty slice []
}
结果很清楚,如果仅仅声明一个切片,它是个空指针,地址是0x0,如果想操作这个指针,必须传&slince。