Go自定義類型、類型別名和結(jié)構(gòu)體
自定義類型
type 自定義類型名 類型
示例
type myInt int
var n myInt
fmt.Printf("%T\n", n)
輸出:main.myInt
說(shuō)明
- 自定義類型在編譯后仍然是我們定義的類型
- 自定義類型可以對(duì)基本類型進(jìn)行拓展與改變
類型別名
type 類型別名=類型
示例
type myInt = int
var n myInt
fmt.Printf("%T\n", n)
輸出:int
說(shuō)明
類型別名并不改變變量的本質(zhì)屬性
類型別名在編譯后會(huì)變回原變量類型
類型別名的意義在于給指定的類型賦于更直白的類型以便得代碼更適合閱讀與解析
結(jié)構(gòu)體
定義格式
type 類型名 struct{
字段名 字段類型
字段名 字段類型
...
}
//匿名結(jié)構(gòu)體
var 變量名 struct{
字段名 字段類型
字段名 字段類型
...
}
//連續(xù)的同類型字段可以用字段類型簡(jiǎn)寫(xiě)
type 類型名 struct{
字段1,字段2 字段類型
...
}
示例
type student struct{
name string //姓名字段
id int //學(xué)號(hào)字段
gender byte //性別字段
}
說(shuō)明
結(jié)構(gòu)體名在一個(gè)包內(nèi)必須是唯一的
字段名在一個(gè)結(jié)構(gòu)內(nèi)是唯一的
結(jié)構(gòu)體可以在函數(shù)內(nèi)定義
使用
type person struct{
name string
id int
}
func main(){
//先聲明再初始化
var a person
a.name = "張三"
a.id = 1
fmt.Println(a)
a.id = 2
fmt.Println(a)
fmt.Println(a.name)
//聲明變量同時(shí)初始化key-value模式
var b = person{
name: "小飛俠"
id: 7
}
//聲明變量同時(shí)用值列表進(jìn)行初始化
var c = person{
"唐伯虎"
9527
}
}
//輸出{張三 1} {張三 2} 張三
用函數(shù)修改結(jié)構(gòu)體字段的值
func f1(p person){
p.name = "李四"
}
func f2(p *person){
p.name = "李四" // <=> (*p).name = "李四"
}
func main(){
var a person
a.name = "張三"
a.id =1
fmt.Println(a) // {張三 1}
f1(a)
fmt.Println(a) // {張三 1}
//無(wú)法改變羡洛,因?yàn)間o中傳入的永遠(yuǎn)是參數(shù)的復(fù)本
f2(&a)
fmt.Println(a)// {李四 1}
//結(jié)構(gòu)體指針
var c = new(person) //c是一個(gè)person類型的指針
c.name = "飛天小豬"
c.id = 17
f2(c)
fmt.Println(*c)
}
內(nèi)存
結(jié)構(gòu)的各個(gè)字段內(nèi)存是連續(xù)的