指針
定義:將地址形象化的稱爲「指針」。將地址形象化的稱爲「指針」。意思是經過它能找到以它爲地址的內存單元。一個指針變量指向了一個值的內存地址。意思是經過它能找到以它爲地址的內存單元。一個指針變量指向了一個值的內存地址。
注意:Go語言支持指針類型*T,指針的指針**T,以及包含包名前綴的*package.T。
一、指針聲明
a) 聲明一個int類型指針
b)聲明一個string類型指針
c) 經過 := 語法來定義指針
var str string = "oldboy"
sp := &str
d)聲明一個int值的指針的指針變量(即,指針的指針)
e) 聲明一個time.Time值的指針變量
二、空指針
定義:當一個指針被定義後沒有分配到任何變量時,它的值爲 nil。nil 指針也稱爲空指針
注意:nil在概念上和其它語言的null、None、nil、NULL同樣,都指代零值或空值
三、指針類型轉換
注意:
a)Go語言是不容許兩個指針類型進行轉換的。
b)unsafe.Pointer類型用於表示任意類型的指針。有4個特殊的只能用於Pointer類型的操做:
1、 任意類型的指針能夠轉換爲一個Pointer類型值
2、 一個Pointer類型值能夠轉換爲任意類型的指針
3、 一個uintptr類型值能夠轉換爲一個Pointer類型值
4、 一個Pointer類型值能夠轉換爲一個uintptr類型值
結構體
定義:結構體是由一系列具備相同類型或不一樣類型的數據構成的數據集合
特色:
一、用來自定義複雜數據結構
二、struct裏面能夠包含一個或多個字段(屬性)
三、struct類型能夠定義方法,注意和函數的區分
四、struct類型是值類型
五、struct類型能夠嵌套
六、結構體是用戶單獨定義的類型,不能和其餘類型進行強制轉換
七、Go中的struct沒有構造函數,通常可使用工廠模式來解決這個問題
八、咱們能夠爲struct中的每一個字段,寫上一個tag。tag能夠經過反射的機制獲取,經常使用的場景就是json序列化和反序列化
九、訪問結構體成員, 用 "." 來鏈接,格式爲:"結構體.成員名"
一、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
}
二、struct 初始化
注意:
有序初始化: 結構體中的多個成員的值,必須一一對應。
無序初始化: 結構體中的多個成員的值,無須一一對應,可初始化部分值。
a)方式一
一、定義
type oldboy struct {
Linux string
Python string
Golang string
}
二、初始化
var ordered = oldboy{"linux", "python", "golang"} // 有序初始化
var disordered = oldboy{Golang: "golang"} // 無序初始化
b)方式二
一、定義
type oldboy struct {
int
string
}
二、初始化
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)結構體包含結構體初始化
一、定義
type Person struct {
name string
age int
addr string
}
type Employee struct {
Person //匿名字段
salary int
int //用內置類型做爲匿名字段
addr string //相似於重載
}
二、初始化
em1 := Employee{
Person{"oldboy", 18, "北京"},
10,
100,
"首都",
}
三、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)