結(jié)構(gòu)體是由一些列屬性組成的復(fù)合數(shù)據(jù)類型灯蝴,每個屬性都具有名稱孝宗、類型和值,結(jié)構(gòu)體將屬性組合在一起進(jìn)行由程序進(jìn)行處理问潭。
自定義類型
在 go 語言中使用 type 聲明一種新的類型婚被,語法格式為:
type TypeName Formatter
Format 可以是任意內(nèi)置類型、函數(shù)簽名灾茁、結(jié)構(gòu)體谷炸、接口。
使用現(xiàn)有類型定義
package main
import "fmt"
// 自定義int類型
type Counter int
// 自定義map[string]string類型
type User map[string]string
// 自定義函數(shù)類型
type Callback func(...string)
func main() {
/* type 自定義類型
語法格式: type TypeName Formatter
結(jié)構(gòu)體是由一些列屬性組成的復(fù)合數(shù)據(jù)類型
類型比較和類型轉(zhuǎn)換
*/
//使用自定義結(jié)構(gòu)體Counter
var c Counter = 20
c += 10
fmt.Println(c)
//使用自定義結(jié)構(gòu)體User
u := make(User)
u["name"] = "wpf"
u["addr"] = "beijing"
fmt.Println(u)
fmt.Printf("%T %T\n", c, u)
//使用自定義結(jié)構(gòu)體Callback
var list Callback = func(s ...string) {
for i, v := range s {
fmt.Println(i, v)
}
}
list("a", "b", "c")
//類型不同,需要轉(zhuǎn)化
var c2 int = 10
fmt.Println(int(c) > c2)
}
定義
結(jié)構(gòu)體定義使用 struct 標(biāo)識特咆,需要指定其包含的屬性(名和類型)录粱,在定義結(jié)構(gòu)體時可以為結(jié)構(gòu)體指定結(jié)構(gòu)體名(命名結(jié)構(gòu)體)啥繁,用于后續(xù)聲明結(jié)構(gòu)體變量使用青抛。
使用struct定義新的類型
// 定義結(jié)構(gòu)體
type User struct {
ID int
Name string
Birthday time.Time
Tel string
Addr string
Remark string
}
聲明
聲明結(jié)構(gòu)體變量只需要定義變量類型為結(jié)構(gòu)體名,變量中的每個屬性被初始化為對應(yīng)類型的零值蜜另。也可聲明結(jié)構(gòu)體指針變量举瑰,此時變量被初始化為 nil。
var u User
fmt.Printf("%T\n", u)
fmt.Printf("%#v\n", u)
var u1 User = User{1, "wpf", time.Now(), "18600", "beijing", "de"}
fmt.Printf("%#v\n", u1)
var pu *User
fmt.Printf("%#v\n", pu)
初始化
使用結(jié)構(gòu)體創(chuàng)建的變量叫做對應(yīng)結(jié)構(gòu)體的實(shí)例或者對象
package main
import (
"fmt"
"time"
)
// 使用struct定義新類型的結(jié)構(gòu)體
type User struct {
ID int
Name string
Birthday time.Time
Tel string
Addr string
Remark string
}
func main() {
//聲明結(jié)構(gòu)體,零值為各屬性的零值
var u User
fmt.Printf("%T\n", u)
fmt.Printf("%#v\n", u)
// 使用結(jié)構(gòu)體字面量初始化結(jié)構(gòu)體值對象, 按順序
var u1 User = User{1, "wpf", time.Now(), "18600", "beijing", "de"}
fmt.Printf("%#v\n", u1)
// 使用結(jié)構(gòu)體零值初始化結(jié)構(gòu)體值對象
var u2 User = User{}
fmt.Printf("%#v\n", u2)
// 也可以省略類型汽畴,根據(jù)初始化類型進(jìn)行推導(dǎo)
var u3 = User{}
fmt.Printf("%#v\n", u3)
// 使用命名方式只初始化一部分屬性耸序,可以不按照順序初始化
var u4 User = User{ID: 1, Birthday: time.Now(), Tel: "186"}
fmt.Printf("%#v\n", u4)
var u5 User = User{
1,
"wpf",
time.Now(),
"188",
"bj",
"ok", //必須要有最后的逗號
}
fmt.Printf("%#v\n", u5)
var u6 User = User{
ID: 1,
Name: "wpfs",
Addr: "北京", //必須要有最后的逗號
}
fmt.Printf("%#v\n", u6)
fmt.Printf("%T\n", &u6)
// 聲明結(jié)構(gòu)體指針變量
var pu *User
fmt.Printf("%T,%#v\n", pu, pu)
var pu1 *User = &u6
fmt.Printf("%T,%#v\n", pu1, pu1)
// 使用 new 函數(shù)進(jìn)行初始化結(jié)構(gòu)體指針對象
var pu2 *User = new(User)
fmt.Printf("%T,%#v\n", pu2, pu2)
var pu3 *int = new(int)
fmt.Printf("%T,%#v\n", pu3, pu3)
}
結(jié)構(gòu)體屬性的訪問和修改
通過結(jié)構(gòu)體對象名/結(jié)構(gòu)體指針對象.屬性名的方式來訪問和修改對象的屬性值
package main
import (
"fmt"
"time"
)
type User struct {
ID int
Name string
Birthday time.Time
Addr string
Tel string
Remark string
}
func main() {
// 簡短聲明
u := User{
ID: 1,
Name: "wpfs",
Addr: "北京",
Tel: "xxxx",
}
// 訪問元素值
fmt.Println(u.ID, u.Name, u.Tel)
// 修改元素值
u.Tel = "18600000001"
fmt.Printf("%#v\n", u)
// 通過指針訪問和更改,(*u).Tel和u.Tel都可以
u2 := &User{
ID: 2,
Name: "won",
}
fmt.Printf("%#v\n", u2)
(*u2).Tel = "18600000001"
fmt.Printf("%#v\n", u2)
// golang語法糖
u2.Addr = "北京"
fmt.Printf("%#v\n", u2)
}
命名結(jié)構(gòu)體嵌入
結(jié)構(gòu)體命名嵌入是指結(jié)構(gòu)體中的屬性對應(yīng)的類型也是結(jié)構(gòu)體
package main
import "fmt"
// 定義Address結(jié)構(gòu)體
type Address struct {
Region string
Street string
Number string
}
// 命名結(jié)構(gòu)體嵌入: 結(jié)構(gòu)體的一個屬性是另外一個結(jié)構(gòu)體
// 定義用戶的結(jié)構(gòu)體
type User struct {
ID int
Name string
Addr Address
}
func main() {
//聲明結(jié)構(gòu)體
var u User
fmt.Printf("%T\n", u)
fmt.Printf("%#v\n", u)
//初始化地址結(jié)構(gòu)體
addr := Address{
Region: "北京",
Street: "霍營",
Number: "999",
}
//初始化用戶結(jié)構(gòu)體
u1 := User{
ID: 1,
Name: "wpfs",
Addr: addr,
}
fmt.Printf("%#v\n", u1)
u2 := User{
ID: 2,
Name: "u2",
Addr: Address{
Region: "北京市",
Street: "霍營",
Number: "002",
},
}
fmt.Printf("%#v\n", u2)
fmt.Println(u2.Addr.Region)
// 屬性的訪問和修改
// 更改用戶的地址
u2.Addr.Region = "海南"
fmt.Println(u2.Addr.Region)
}