go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析
分類
| 類型 | 名稱 | 長度 | 默認值 | 說明 |
|---|---|---|---|---|
| pointer | 指針 | nil | ||
| array | 數(shù)組 | 0 | ||
| slice | 切片 | nil | 引?類型 | |
| map | 字典 | nil | 引?類型 | |
| struct | 結(jié)構(gòu)體 |
數(shù)組
如果要存儲班級里所有學(xué)生的數(shù)學(xué)成績,應(yīng)該怎樣存儲呢?可能有同學(xué)說,通過定義變量來存儲。但是,問題是班級有80個學(xué)生,那么要定義80個變量嗎?
像以上情況,最好是通過數(shù)組的方式來存儲。
所謂的數(shù)組:是指一系列同一類型數(shù)據(jù)的集合。
數(shù)組定義
var a [10]int
數(shù)組定義也是通過var關(guān)鍵字,后面是數(shù)組的名字a,長度是10,類型是整型。表示:數(shù)組a能夠存儲10個整型數(shù)字。也就是說,數(shù)組a的長度是10。
我們可以通過len( )函數(shù)測試數(shù)組的長度,如下所示:
var a [10]int fmt.Println(len(a)) //10
當(dāng)定義完成數(shù)組a后,就在內(nèi)存中開辟了10個連續(xù)的存儲空間,每個數(shù)據(jù)都存儲在相應(yīng)的空間內(nèi),數(shù)組中包含的每個數(shù)據(jù)被稱為數(shù)組元素(element),一個數(shù)組包含的元素個數(shù)被稱為數(shù)組的長度。
注意:數(shù)組的長度只能是常量。以下定義是錯誤的:
var n int = 10 var a [n]int
結(jié)構(gòu)體
package main
import "fmt"
func main(){
// 1.定義結(jié)構(gòu)體
type Student struct{
id int
name string
age int
addr string
}
//2.結(jié)構(gòu)體初始化1,值的順序與結(jié)構(gòu)體成員的順序保持一致
chary := Student{1,"chary",18,"上海"}
fmt.Println(chary) //{1 chary 18 上海}
//2.結(jié)構(gòu)體初始化2,沒有初始化的成員自動賦值0
jeff := Student{name:"jeff"} //{0 jeff 0 }
fmt.Println(jeff)
//3.成員使用
chary.id = 100 //修改
fmt.Println(chary.id )
//4.結(jié)構(gòu)體比較,兩個結(jié)構(gòu)體可以使用 == 或 != 運算符進行比較,但不支持 > 或 <。
fmt.Println(jeff==chary) //false
//5.同類型的兩個結(jié)構(gòu)體變量可以相互賦值。
var user Student
user = jeff
fmt.Println(user) //{0 jeff 0 }
}
結(jié)構(gòu)體繼承
一般情況下,定義結(jié)構(gòu)體的時候是字段名與其類型一一對應(yīng),實際上Go支持只提供類型,而不寫字段名的方式,也就是匿名字段,也稱為嵌入字段。
當(dāng)匿名字段也是一個結(jié)構(gòu)體的時候,那么這個結(jié)構(gòu)體所擁有的全部字段都被隱式地引入了當(dāng)前定義的這個結(jié)構(gòu)體。
//人
type Person struct {
name string
sex byte
age int
}
//學(xué)生
type Student struct {
Person //匿名字段,那么默認Student就包含了Person的所有字段
id int
addr string
}
結(jié)構(gòu)體初始化
//人
type Person struct {
name string
sex byte
age int
}
//學(xué)生
type Student struct {
Person//匿名字段,那么默認Student就包含了Person的所有字段
id int
addr string
}
func main() {
//順序初始化
s1 := Student{Person{"mike",'m',18},1,"sz"}
//s1 = {Person:{name:mike sex:109 age:18}id:1 addr:sz}
fmt.Printf("s1=%+v\n",s1)
//s2 := Student{"mike",'m',18,1,"sz"}//err
//部分成員初始化1
s3 := Student{Person:Person{"lily",'f',19},id:2}
//s3 = {Person:{name:lily sex:102 age:19}id:2 addr:}
fmt.Printf("s3=%+v\n",s3)
//部分成員初始化2
s4 := Student{Person:Person{name:"tom"},id:3}
//s4 = {Person:{name:tomsex:0age:0}id:3addr:}
fmt.Printf("s4=%+v\n",s4)
}
成員的操作
var s1 Student//變量聲明
//給成員賦值
s1.name = "mike"http://等價于s1.Person.name="mike"
s1.sex = 'm'
s1.age = 18
s1.id = 1
s1.addr = "sz"
fmt.Println(s1) //{{mike 109 18}1 sz}
var s2 Student//變量聲明
s2.Person = Person{"lily",'f',19}
s2.id = 2
s2.addr = "bj"
fmt.Println(s2) //{{lily 102 19}2 bj}
同名字段
//人
type Person struct{
name string
sex byte
age int
}
//學(xué)生
type Student struct{
Person //匿名字段,那么默認Student就包含了Person的所有字段
id int
addr string
name string //和Person中的name同名
}
func main(){
var s Student//變量聲明
//給Student的name,還是給Person賦值?
s.name = "mike"
//{Person:{name:sex:0age:0}id:0addr:name:mike}
fmt.Printf("%+v\n",s)
//默認只會給最外層的成員賦值
//給匿名同名成員賦值,需要顯示調(diào)用
s.Person.name = "yoyo"
//Person:{name:yoyosex:0age:0}id:0addr:name:mike}
fmt.Printf("%+v\n",s)
}
其它匿名字段
非結(jié)構(gòu)體類型
所有的內(nèi)置類型和自定義類型都是可以作為匿名字段的:
type mystr string//自定義類型
type Person struct {
name string
sex byte
age int
}
type Student struct {
Person //匿名字段,結(jié)構(gòu)體類型
int //匿名字段,內(nèi)置類型
mystr //匿名字段,自定義類型
}
func main() {
//初始化
s1 := Student{Person{"mike",'m',18},1,"bj"}
//{Person:{name:mikesex:109age:18}int:1mystr:bj}
fmt.Printf("%+v\n",s1)
//成員的操作,打印結(jié)果:mike,m,18,1,bj
fmt.Printf("%s,%c,%d,%d,%s\n",s1.name,s1.sex,s1.age,s1.int,s1.mystr)
}
結(jié)構(gòu)體指針類型
type Person struct { //人
name string
sex byte
age int
}
type Student struct {//學(xué)生
*Person //匿名字段,結(jié)構(gòu)體指針類型
id int
addr string
}
func main() {
//初始化
s1 := Student{&Person{"mike",'m',18},1,"bj"}
//{Person:0xc0420023e0id:1addr:bj}
fmt.Printf("%+v\n",s1)
//mike,m,18
fmt.Printf("%s,%c,%d\n",s1.name,s1.sex,s1.age)
//聲明變量
var s2 Student
s2.Person = new(Person)//分配空間
s2.name = "yoyo"
s2.sex = 'f'
s2.age = 20
s2.id = 2
s2.addr = "sz"
//yoyo10220220
fmt.Println(s2.name,s2.sex,s2.age,s2.id,s2.age)
}
結(jié)構(gòu)體字段實現(xiàn)接口
package main
import (
"fmt"
"sync"
)
type UserAges struct {
ages map[string] int
sync.Mutex
}
func (u *UserAges)Add(name string,age int) {
u.Lock()
defer u.Unlock()
u.ages[name] = age
}
func (u *UserAges)Get(name string)int{
if age,ok:=u.ages[name];ok{
return age
}
return -1
}
func main() {
dic:=make(map[string]int)
dic["age"] = 18
r:=UserAges{ages: dic}
r.Add("jeff",20)
fmt.Println(r)
age:=r.Get("age")
fmt.Println(age)
}以上就是go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析的詳細內(nèi)容,更多關(guān)于go語言數(shù)組及結(jié)構(gòu)體繼承和初始化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go build 通過文件名后綴實現(xiàn)不同平臺的條件編譯操作
這篇文章主要介紹了go build 通過文件名后綴實現(xiàn)不同平臺的條件編譯操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Go語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON
本文主要介紹了Go語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01

