指針
定義:將地址形象化的稱為“指針”。將地址形象化的稱為“指針”。意思是通過它能找到以它為地址的內存單元。一個指針變量指向了一個值的內存地址。意思是通過它能找到以它為地址的內存單元。一個指針變量指向了一個值的內存地址。
注意:Go語言支持指針類型*T,指針的指針**T,以及包含包名前綴的*package.T。
1、指針聲明
a) 聲明一個int類型指針
var ip *int
b)聲明一個string類型指針
var sp *string
c) 通過 := 語法來定義指針
var str string = "oldboy" sp := &str
d)聲明一個int值的指針的指針變量(即,指針的指針)
var p **int
e) 聲明一個time.Time值的指針變量
var t *time.Time
2、空指針
定義:當一個指針被定義后沒有分配到任何變量時,它的值為 nil。nil 指針也稱為空指針
注意:nil在概念上和其它語言的null、None、nil、NULL一樣,都指代零值或空值
3、指針類型轉換
注意: a)Go語言是不允許兩個指針類型進行轉換的。 b)unsafe.Pointer類型用於表示任意類型的指針。有4個特殊的只能用於Pointer類型的操作: 1、 任意類型的指針可以轉換為一個Pointer類型值 2、 一個Pointer類型值可以轉換為任意類型的指針 3、 一個uintptr類型值可以轉換為一個Pointer類型值 4、 一個Pointer類型值可以轉換為一個uintptr類型值
結構體
定義:結構體是由一系列具有相同類型或不同類型的數據構成的數據集合
特點:
1、用來自定義復雜數據結構
2、struct里面可以包含一個或多個字段(屬性)
3、struct類型可以定義方法,注意和函數的區分
4、struct類型是值類型
5、struct類型可以嵌套
6、結構體是用戶單獨定義的類型,不能和其他類型進行強制轉換
7、Go中的struct沒有構造函數,一般可以使用工廠模式來解決這個問題
8、我們可以為struct中的每個字段,寫上一個tag。tag可以通過反射的機制獲取,常用的場景就是json序列化和反序列化
9、訪問結構體成員, 用 "." 來連接,格式為:"結構體.成員名"
1、struct定義
a)定義一個新的數據類型,結構體中只有一個成員。
type bigint int64
type smallint int8
b) 定義一個新的數據類型,結構體中有多個成員
type oldboy struct { Linux string Python string Golang string }
c) 定義一個新的數據類型,指向結構體的指針
type Linux string type oldboy struct { *Linux }
2、struct 初始化
注意:
有序初始化: 結構體中的多個成員的值,必須一一對應。
無序初始化: 結構體中的多個成員的值,無須一一對應,可初始化部分值。
a)方式一
1、定義
type oldboy struct { Linux string Python string Golang string }
2、初始化
var ordered = oldboy{"linux", "python", "golang"} // 有序初始化 var disordered = oldboy{Golang: "golang"} // 無序初始化
b)方式二
1、定義
type oldboy struct { int string }
2、初始化
two := new(oldboy) //同 var two *oldboy = new(oldboy) //指針變量 three := oldboy{1, "three"} four := oldboy{} five := &oldboy{} //指針變量 six := &oldboy{2, "six"} //同 var six *oldboy = &oldboy{2, "six"} //指針變量
c)結構體包含結構體初始化
1、定義
type Person struct { name string age int addr string } type Employee struct { Person //匿名字段 salary int int //用內置類型作為匿名字段 addr string //類似於重載 }
2、初始化
em1 := Employee{ Person{"oldboy", 18, "北京"}, 10, 100, "首都", }
3、struct與tag應用
注意:tag聲明struct結構的時候,在屬性的右側用小米點括起來的內容叫標簽(Tag),
在轉換成其它數據格式的時候,會使用其中特定的字段作為鍵值,一般在序列化和反序列化使用
a)定義
type User struct { UserId int UserName string } type UserTag struct { UserId int `json:"user_id" bson:"user_id"` UserName string `json:"user_name" bson:"user_name"` }
b)初始化
user := &User{UserId: 1, UserName: "oldboy"} json_user, _ := json.Marshal(user) fmt.Printf("struct User echo : %v\n", string(json_user)) user_tag := &UserTag{UserId: 1, UserName: "oldboy"} json_user_tag, _ := json.Marshal(user_tag)