結(jié)構(gòu)體
- 和C語(yǔ)言幾乎一模一樣
- 格式:
type 結(jié)構(gòu)體類型名稱 struct{
屬性名稱 屬性類型;
屬性名稱 屬性類型;
}
結(jié)構(gòu)體變量的定義
格式:var 結(jié)構(gòu)體名稱 結(jié)構(gòu)體類型
和切片和字典不一樣,Go語(yǔ)言中結(jié)構(gòu)體定義了就可以直接使用
結(jié)構(gòu)體的初始化
- 定義的同時(shí)完全初始化
- 注意:定義的同時(shí)只能完全初始化
type Person struct{
name string
age int
}
var per Person = Person{"xxz",20}
per2 := Person{"xxz",20}
- 先定義后完全初始化
type Person struct{
name string
age int
}
var per Person
per = Person{"xxz",20}
per = Person{name:"xxz",age:20}
- 先定義后部分初始化
- 注意點(diǎn):定義的同時(shí)部分初始化必須加上初始化的key
type Person struct{
name string
age int
}
var per Person
per = {name:"xxz"}
結(jié)構(gòu)體和函數(shù)
- 結(jié)構(gòu)體類型和數(shù)組一樣,是值傳遞,函數(shù)內(nèi)改變形參結(jié)構(gòu)體屬性的值不會(huì)影響到實(shí)參
type Person struct{
name string
age int
}
pp := Person{name:"xxz",age:18}
fmt.Println(pp.name)//"xxz"
change(pp)
fmt.Println(pp.name)//"xxz"
func change(pp Person){
pp.name = "zs"
}
復(fù)雜的結(jié)構(gòu)體
- 結(jié)構(gòu)體內(nèi)的數(shù)據(jù)類型,如果是切片,字典這種數(shù)據(jù)類型,那么必須給他們初始化才能使用
type Person struct{
name string
age int
sce []int
dict map[string]string
}
var per Person
per.name = "xxz"http:// 不報(bào)錯(cuò)
per.age = 18//不報(bào)錯(cuò)
//per.sce[0] = 1//報(bào)錯(cuò)
//per.dict["name"] = "xxz"http://報(bào)錯(cuò)
per.sce = make([]int,2)
per.sce[0] = 1
per.sce[1] = 2 //不報(bào)錯(cuò)
per.dict = make(map[string]string)
per.dict["name"] = "zs"
fmt.Println(per)//不報(bào)錯(cuò)
結(jié)構(gòu)體類型的轉(zhuǎn)換
- 只有當(dāng)結(jié)構(gòu)體完全相同,完全相同,完全相同時(shí)才能相互轉(zhuǎn)換
- 包括屬性名稱,屬性類型,屬性順序,屬性個(gè)數(shù)完全相同
結(jié)構(gòu)體匿名屬性
- 沒(méi)有名稱的屬性叫匿名屬性
- 調(diào)用匿名屬性用結(jié)構(gòu)體名稱.數(shù)據(jù)類型即可
type Person struct{
int
name string
}
var per Person = Person{666,"xxz"}
fmt.Println(per.int)//666
- 結(jié)構(gòu)體匿名屬性一般用于結(jié)構(gòu)體的嵌套定義
type Date struct{
year int
month int
day int
}
type Person struct{
name string
// year int
// month int
// day int
Date
}
type Animal struct{
name string
// year int
// month int
// day int
// birthday Date
Date
}
/ /定義
var per Person = {"xxz",Date{1998,4,9}}
fmt.Println(per.name)//"xxz"
fmt.Println(per.Date.year)// 1998
結(jié)構(gòu)體嵌套定義
- 第一種方式
type 結(jié)構(gòu)體名稱1 struct{
}
type 結(jié)構(gòu)體名稱2 struct{
結(jié)構(gòu)體名稱1
}
- 第二種方式
type 結(jié)構(gòu)體名稱1 struct{
}
type 結(jié)構(gòu)體名稱2 struct{
結(jié)構(gòu)體名稱1
}
type 結(jié)構(gòu)體名稱3 struct{
結(jié)構(gòu)體名稱2
}
- 第三種方式
type 結(jié)構(gòu)體名稱1 struct{
}
type 結(jié)構(gòu)體名稱2 struct{
}
type 結(jié)構(gòu)體名稱3 struct{
結(jié)構(gòu)體名稱1
結(jié)構(gòu)體名稱2
}
- 注意點(diǎn):
1 結(jié)構(gòu)體的屬性類型不能是當(dāng)前結(jié)構(gòu)體的類型
2 只有匿名屬性才會(huì)向上查找, 非匿名屬性不會(huì)向上查找(訪問(wèn)結(jié)構(gòu)體屬性時(shí),首先在源結(jié)構(gòu)體內(nèi)尋找屬性,如果沒(méi)有,再去嵌套的結(jié)構(gòu)體內(nèi)尋找屬性)