網(wǎng)站首頁 編程語言 正文
分類
類型 | 名稱 | 長度 | 默認(rèn)值 | 說明 |
---|---|---|---|---|
pointer | 指針 | ? | nil | ? |
array | 數(shù)組 | ? | 0 | ? |
slice | 切片 | ? | nil | 引?類型 |
map | 字典 | ? | nil | 引?類型 |
struct | 結(jié)構(gòu)體 | ? | ? | ? |
數(shù)組
如果要存儲(chǔ)班級(jí)里所有學(xué)生的數(shù)學(xué)成績,應(yīng)該怎樣存儲(chǔ)呢?可能有同學(xué)說,通過定義變量來存儲(chǔ)。但是,問題是班級(jí)有80個(gè)學(xué)生,那么要定義80個(gè)變量嗎?
像以上情況,最好是通過數(shù)組的方式來存儲(chǔ)。
所謂的數(shù)組:是指一系列同一類型數(shù)據(jù)的集合。
數(shù)組定義
var a [10]int
數(shù)組定義也是通過var關(guān)鍵字,后面是數(shù)組的名字a,長度是10,類型是整型。表示:數(shù)組a能夠存儲(chǔ)10個(gè)整型數(shù)字。也就是說,數(shù)組a的長度是10。
我們可以通過len( )函數(shù)測試數(shù)組的長度,如下所示:
var a [10]int fmt.Println(len(a)) //10
當(dāng)定義完成數(shù)組a后,就在內(nèi)存中開辟了10個(gè)連續(xù)的存儲(chǔ)空間,每個(gè)數(shù)據(jù)都存儲(chǔ)在相應(yīng)的空間內(nèi),數(shù)組中包含的每個(gè)數(shù)據(jù)被稱為數(shù)組元素(element),一個(gè)數(shù)組包含的元素個(gè)數(shù)被稱為數(shù)組的長度。
注意:數(shù)組的長度只能是常量。以下定義是錯(cuò)誤的:
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,沒有初始化的成員自動(dòng)賦值0 jeff := Student{name:"jeff"} //{0 jeff 0 } fmt.Println(jeff) //3.成員使用 chary.id = 100 //修改 fmt.Println(chary.id ) //4.結(jié)構(gòu)體比較,兩個(gè)結(jié)構(gòu)體可以使用 == 或 != 運(yùn)算符進(jìn)行比較,但不支持 > 或 <。 fmt.Println(jeff==chary) //false //5.同類型的兩個(gè)結(jié)構(gòu)體變量可以相互賦值。 var user Student user = jeff fmt.Println(user) //{0 jeff 0 } }
結(jié)構(gòu)體繼承
一般情況下,定義結(jié)構(gòu)體的時(shí)候是字段名與其類型一一對(duì)應(yīng),實(shí)際上Go支持只提供類型,而不寫字段名的方式,也就是匿名字段,也稱為嵌入字段。
當(dāng)匿名字段也是一個(gè)結(jié)構(gòu)體的時(shí)候,那么這個(gè)結(jié)構(gòu)體所擁有的全部字段都被隱式地引入了當(dāng)前定義的這個(gè)結(jié)構(gòu)體。
//人 type Person struct { name string sex byte age int } //學(xué)生 type Student struct { Person //匿名字段,那么默認(rèn)Student就包含了Person的所有字段 id int addr string }
結(jié)構(gòu)體初始化
//人 type Person struct { name string sex byte age int } //學(xué)生 type Student struct { Person//匿名字段,那么默認(rèn)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://等價(jià)于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 //匿名字段,那么默認(rèn)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) //默認(rèn)只會(huì)給最外層的成員賦值 //給匿名同名成員賦值,需要顯示調(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)體字段實(shí)現(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) }
原文鏈接:https://www.cnblogs.com/guyouyin123/p/13860272.html
相關(guān)推薦
- 2023-07-26 vite項(xiàng)目中處理各種靜態(tài)資源的引入方式介紹
- 2022-05-31 Python必備技巧之Pandas數(shù)據(jù)合并函數(shù)_python
- 2022-11-20 Android類加載流程分析_Android
- 2022-12-10 C++中如何將數(shù)據(jù)保存為CSV文件_C 語言
- 2022-12-01 Go語言常用的打log方式詳解_Golang
- 2022-12-29 Python利用tkinter實(shí)現(xiàn)一個(gè)簡易番茄鐘的示例代碼_python
- 2022-09-26 Python實(shí)現(xiàn)自動(dòng)化域名批量解析分享_python
- 2022-08-27 解決react中useState狀態(tài)異步更新的問題_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支