Go語言struct類型介紹
struct
我們可以聲明新的類型,作為其它類型的屬性或字段容器。
如,創(chuàng)建一個(gè)自定義類型person代表一個(gè)人的實(shí)體。這個(gè)實(shí)體擁有屬性:姓名&年齡。這樣的類型我們稱之為struct。
type person struct{
name string
age int
}
var P person // P 現(xiàn)在就是 person 類型的變量了
P.name = "Astaxie" // 賦值 "Astaxie" 給 P 的 name 屬性 .
P.age = 25 // 賦值 "25" 給變量 P 的 age 屬性
fmt.Printf("The person's name is %s", P.name) // 訪問 P 的 name 屬性 .
除了上面這種P的聲明使用之外,還有其他兩種聲明使用方式
1、按照順序提供初始化值
P := person{"Liuxinming", 28}
2、通過field:value的方式初始化,這樣可以任意順序
P := person{age:28, name:"Liuxinming"}
舉例:
package main
import "fmt"
//聲明一個(gè)新的類型
type person struct {
name string
avg int
}
//比較兩個(gè)人的年齡,返回年齡大的那個(gè)人,并且返回年齡差
//struct 也是傳值的
func older(p1, p2 person) (person, int) {
if p1.avg > p2.avg { //比較p1和p2年齡
return p1, p1.avg - p2.avg
}
return p2, p2.avg - p1.avg
}
func main() {
var tom person
//賦值初始化
tom.name, tom.avg = "Tom", 18
//兩個(gè)字段都寫清楚的初始化
bob := person{avg: 25, name: "Bob"}
//按照struct定義順序初始化
paul := person{"Paul", 43}
tb_Older, tb_diff := older(tom, bob)
tp_Older, tp_diff := older(tom, paul)
bp_Older, bp_diff := older(bob, paul)
fmt.Printf("Of %s and %s, %s is older by %d years\n",
tom.name, bob.name, tb_Older.name, tb_diff)
fmt.Printf("Of %s and %s, %s is older by %d years\n",
tom.name, paul.name, tp_Older.name, tp_diff)
fmt.Printf("Of %s and %s, %s is older by %d years\n",
bob.name, paul.name, bp_Older.name, bp_diff)
}
輸出結(jié)果如下:
Of Tom and Bob, Bob is older by 7 years
Of Tom and Paul, Paul is older by 25 years
Of Bob and Paul, Paul is older by 18 years
struct的匿名字段
我們上面介紹了如何定義一個(gè)struct,定義的時(shí)候是字段名與其類型一一對應(yīng),實(shí)際上Go支持只提供類型,而不寫字段名的方式,也就是匿名字段,也稱為嵌入字段。
當(dāng)匿名字段是一個(gè)struct的時(shí)候,那么這個(gè)struct所擁有的全部字段都被隱式地引入了當(dāng)前定義的這個(gè)struct:
// struct2.go
package main
import (
"fmt"
)
type Human struct {
name string
age int
weight int
}
type Student struct {
Human //匿名字段,那么默認(rèn)struct就包含了Human所有字段
speciality string
}
func main() {
//初始化一個(gè)學(xué)生
mark := Student{Human{"Mark", 25, 100}, "Computer Science"}
//訪問相應(yīng)的字段
fmt.Println("His name is ", mark.name)
fmt.Println("His age is ", mark.age)
fmt.Println("His weight is ", mark.weight)
fmt.Println("His speciality is ", mark.speciality)
//修改對應(yīng)的信息
mark.speciality = "AI"
fmt.Println("Mark changed his speciality")
fmt.Println("His speciality is ", mark.speciality)
// 修改他的年齡信息
fmt.Println("Mark become old")
mark.age = 46
fmt.Println("His age is", mark.age)
// 修改他的體重信息
fmt.Println("Mark is not an athlet anymore")
mark.weight += 60
fmt.Println("His weight is", mark.weight)
}
輸出結(jié)果:
His name is Mark
His age is 25
His weight is 100
His speciality is Computer Science
Mark changed his speciality
His speciality is AI
Mark become old
His age is 46
Mark is not an athlet anymore
His weight is 160
相關(guān)文章
淺析Go語言如何避免數(shù)據(jù)競爭Data?Race和競態(tài)條件Race?Condition
在并發(fā)編程中,數(shù)據(jù)競爭?(Data?Race)?和?競態(tài)條件?(Race?Condition)?是兩個(gè)常見的問題,本文將簡單介紹一下二者如何避免,有需要的可以了解下2025-01-01
詳解Go語言strconv與其他基本數(shù)據(jù)類型轉(zhuǎn)換函數(shù)的使用
這篇文章將以 string 類型為中心,通過 strconv 標(biāo)準(zhǔn)庫,介紹其與其他基本數(shù)據(jù)類型相互轉(zhuǎn)換的函數(shù)。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-12-12

