傳送門:Golang學(xué)習(xí)筆記之方法
結(jié)構(gòu)體(struct)是用戶自定義的類型胚股,它代表若干字段的集合。
? 值類型士八,賦值和傳參會(huì)復(fù)制全部內(nèi)容容燕。可? "_" 定義補(bǔ)位字段婚度,?持指向??類型的指針成員蘸秘。
?結(jié)構(gòu)體內(nèi)字段?持 "=="、 "!=", 結(jié)構(gòu)體就支持相應(yīng)操作
?可?作 map 鍵類型。
一醋虏、定義
//包內(nèi)使用首字母小寫寻咒,包外使用首字母大寫
type employee struct {
firstName string
lastName string
age int
}
二、初始化的幾種方式
//初始化方式1
var emp1 employee
emp1.firstName = "hello"
emp1.lastName = "world"
emp1.age = 20
fmt.Println(emp1)
//初始化方式2利用鍵值方式
emp2 := employee{
firstName: "Sam",
age: 25,
lastName: "Anderson", //使用鍵值方式這個(gè)逗號(hào)不可以省略
}
fmt.Println(emp2)
//初始化方式3順序初始化,必須包含全部字段颈嚼,否則會(huì)出錯(cuò)毛秘。
emp3 := employee{"Thomas", "Paul", 29}
fmt.Println(emp3)
三、支持匿名結(jié)構(gòu)
//匿名結(jié)構(gòu)阻课,可?作結(jié)構(gòu)成員或定義變量叫挟。
type file struct {
name string
size int
attr struct {
perm int
owner int
}
}
func main() {
//匿名結(jié)構(gòu)
f := file{
name: "test.txt",
size: 1025,
// attr: {0755, 1}, //組合文字中缺少類型
}
f.attr.owner = 1
f.attr.perm = 0755
var attr = struct {
perm int
owner int
}{2, 0755}
f.attr = attr
fmt.Println(f.attr.perm)
}
四、匿名字段
?通俗來說是?個(gè)與成員類型同名 (不含包名) 的字段限煞。
?被匿名嵌?的可以是任何類型霞揉,包括指針。
?不能同時(shí)嵌?某?類型和其指針類型晰骑,因?yàn)樗鼈兠窒嗤?/strong>
?匿名字段可以字段提升适秩。可以像普通字段那樣訪問匿名字段成員硕舆,編譯器從外向內(nèi)逐級(jí)查找所有層次的匿名字段秽荞,直到發(fā)現(xiàn)目標(biāo)或出錯(cuò)。但結(jié)構(gòu)體匿名字段外層同名字段會(huì)遮蔽嵌?字段成員
//匿名字段
type person struct {
string
int
employee
}
func main(){
//匿名字段會(huì)把類型用作變量名
p := person{"Hello", 20, emp1}
p.string = "Other"
fmt.Println(p, p.string) //{Other 20} Other
fmt.Println(p.lastName)//等價(jià)于p.employee.lastName//輸出:hello
}
五抚官、結(jié)構(gòu)體嵌套
//結(jié)構(gòu)體嵌套
type address struct {
city, state string
}
type student struct {
name string
age int
address address
}
func main(){
//結(jié)構(gòu)體嵌套
var s student
s.name = "小明"
s.age = 18
s.address = address{
city: "北京",
state: "中國",
}
fmt.Println(s)
fmt.Println(s.name)
fmt.Println(s.address.city)
}
完整代碼實(shí)例
package main
import (
"fmt"
)
//需要添加注釋或者改成非導(dǎo)出變量(首字母小寫)
type employee struct {
firstName string
lastName string
age int
}
//匿名字段
type person struct {
string
int
employee
}
//結(jié)構(gòu)體嵌套
type address struct {
city, state string
}
type student struct {
name string
age int
address address
}
//匿名結(jié)構(gòu)扬跋,可?作結(jié)構(gòu)成員或定義變量。
type file struct {
name string
size int
attr struct {
perm int
owner int
}
}
func main() {
//初始化方式1
var emp1 employee
emp1.firstName = "hello"
emp1.lastName = "world"
emp1.age = 20
fmt.Println(emp1)
//初始化方式2利用鍵值方式
emp2 := employee{
firstName: "Sam",
age: 25,
lastName: "Anderson", //使用鍵值方式這個(gè)逗號(hào)不可以省略
}
fmt.Println(emp2)
//初始化方式3順序初始化,必須包含全部字段凌节,否則會(huì)出錯(cuò)钦听。
emp3 := employee{"Thomas", "Paul", 29}
fmt.Println(emp3)
//結(jié)構(gòu)體指針
emp5 := &employee{"Sam", "Anderson", 55}
fmt.Println("First Name:", (*emp5).firstName)
fmt.Println("Age:", (*emp5).age)
//匿名字段會(huì)把類型用作變量名
p := person{"Hello", 20, emp1}
p.string = "Other"
fmt.Println(p, p.string) //{Other 20} Other
fmt.Println(p.lastName)//等價(jià)于p.employee.lastName//輸出:hello
//匿名結(jié)構(gòu)
f := file{
name: "test.txt",
size: 1025,
// attr: {0755, 1}, //組合文字中缺少類型
}
f.attr.owner = 1
f.attr.perm = 0755
var attr = struct {
perm int
owner int
}{2, 0755}
f.attr = attr
fmt.Println(f.attr.perm)
//結(jié)構(gòu)體嵌套
var s student
s.name = "小明"
s.age = 18
s.address = address{
city: "北京",
state: "中國",
}
fmt.Println(s)
fmt.Println(s.name)
fmt.Println(s.address.city)
}