package main
func main(){
/*
先一個思考題,我們定義一個Person結構體(包括 名字,年齡)
我們看看下面一段代碼,輸出什麽内容?
var p1 Person
p1.Age=10
p1.Name=“小明”
var p2 Person =p1
fmt.Println(p2.Age)
p2.Name = "tom"
fmt.Printf("p2.Name=%v p1.Name=%v",p2.Name,p1,Name)
//説明:
1)第3種和第4種方式返回的是結構體指針。
2)結構體指針訪問字段的標準方式應該是:(*結構體指針)字段名,比如(*person)Name="tom"
3)但go做了一個簡化,也支持結構體指針字段名,比如person.Name="tom".更加符合程序員使用的習慣。go編譯器底層對person.Name做了轉化(*person).Name.
基本説明
變量總是存在内存中的,那麽結構體變量在内存中究竟是怎樣存在的?
這裏我們給大家夥畫一個圖來説明一下結構體變量在内存中如果存在?
輸出的結果是;person
下面一段代碼,會輸出什麽信息
var p1 Person
p1.Age=10
p1.Name="小明"
var p2 *Person = &p1
fmt.Println((*p2).Age)
fmt.Println(p2.Age)
p2.Name="tom"
fmt.Printf("p2.Name=%v p1.Name=%v\n",p2.Name,p1.Name)
fmt.Printf("p2.Name=%v p1.Name=%v\n",(*p2).Name,p1.Name)
fmt.Printf("p1的地址%p\n",&p1)
fmt.Printf("P2的地址%p p2的值%p\n",&p2,p2)
看下面代碼,並分析原因
var p1 Person
p1.Age=10
p1.Name="小明"
var p2 *Person = &p1
fmt.Println(*p2.Age)//能不能這樣寫?不能這樣寫,會報錯,原因是的運行符優先級比.高。
*/
}