&:對一個變量取地址
*:指針,一種變量類型;變量存儲的是地址
*p:指針p指向的內存地址中 存放的內容。 *p會解引用p指針,從它的內存地址得到這個地址當前對應的值
假設有一個變量a
a := 2
p := &a //&a:取a的地址
fmt.Println(p, *p) //0xc0000140d0 2
以一個函數爲例
func demo(v1, v2 *int) int { //傳入的參數是int類型指針
*v1 = 5
*v2 = 6
return *v1 * *v2
}
func main() {
v1 := 1
v2 := 2
fmt.Println(demo(&v1, &v2)) //30
fmt.Println(v1, v2) // 5 6
}
以結構體爲例
type person struct { //一個結構體
name string
age int
}
func newperson(name string) *person { //定義一個新結構體
p := person{name: name}
p.age = 40
return &p
}
t1 := person{"bob", 20}
fmt.Println("t1", t1) //t1 {bob 20}
tp := &t1
fmt.Println(&t1) //&{bob 20}
fmt.Println(*tp) // {bob 20}
t3 := newperson("lili")
fmt.Println("t3", t3) //t3 &{lili 40}
fmt.Println("t3", *t3) //t3 {lili 40}
fmt.Println(t1)//{bob 20}