最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析

 更新時間:2022年04月15日 09:47:18   作者:Jeff的技術(shù)棧  
這篇文章主要為大家介紹了go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪

分類

類型名稱長度默認(rèn)值說明
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)體可以使用 == 或 != 運(yùn)算符進(jìn)行比較,但不支持 > 或 <。
	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),實(shí)際上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    //匿名字段,那么默認(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://等價于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)只會給最外層的成員賦值
    //給匿名同名成員賦值,需要顯示調(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{&amp;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)
}

以上就是go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析的詳細(xì)內(nèi)容,更多關(guān)于go語言數(shù)組及結(jié)構(gòu)體繼承和初始化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go項(xiàng)目中添加生成時間與版本信息的方法

    Go項(xiàng)目中添加生成時間與版本信息的方法

    本文主要介紹了Go項(xiàng)目中添加生成時間與版本信息的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 如何使用go-zero開發(fā)線上項(xiàng)目

    如何使用go-zero開發(fā)線上項(xiàng)目

    這篇文章主要介紹了如何使用go-zero開發(fā)線上項(xiàng)目,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • go build 通過文件名后綴實(shí)現(xiàn)不同平臺的條件編譯操作

    go build 通過文件名后綴實(shí)現(xiàn)不同平臺的條件編譯操作

    這篇文章主要介紹了go build 通過文件名后綴實(shí)現(xiàn)不同平臺的條件編譯操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang 中signal包的Notify用法說明

    golang 中signal包的Notify用法說明

    這篇文章主要介紹了golang 中signal包的Notify用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Go語言為什么不支持前綴自增運(yùn)算符原理解析

    Go語言為什么不支持前綴自增運(yùn)算符原理解析

    這篇文章主要為大家介紹了Go語言為什么不支持前綴自增運(yùn)算符原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • golang中使用sync.Map的方法

    golang中使用sync.Map的方法

    這篇文章主要介紹了golang中使用sync.Map的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Go語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON

    Go語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON

    本文主要介紹了Go語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Golang檢查變量類型的四種方式

    Golang檢查變量類型的四種方式

    Go提供幾種方法檢查變量的類型,在字符串格式化標(biāo)識%T, 反射方式:reflect.TypeOf, reflect.ValueOf.Kind,另外還有使用類型斷言,switch case方式,下面通過實(shí)例分別介紹這四類方法,需要的朋友可以參考下
    2022-10-10
  • Go設(shè)計(jì)模式之模板方法模式講解和代碼示例

    Go設(shè)計(jì)模式之模板方法模式講解和代碼示例

    模版方法是一種行為設(shè)計(jì)模式, 它在基類中定義了一個算法的框架, 允許子類在不修改結(jié)構(gòu)的情況下重寫算法的特定步驟,本文將通過代碼示例給大家詳細(xì)的介紹一下Go模板方法模式,需要的朋友可以參考下
    2023-08-08
  • 深入了解Golang中占位符的使用

    深入了解Golang中占位符的使用

    在寫?golang?的時候,也是有對應(yīng)的格式控制符,也叫做占位符,寫這個占位符,需要有對應(yīng)的數(shù)據(jù)與之對應(yīng),不能瞎搞。本文就來和大家聊聊Golang中占位符的使用,希望對大家有所幫助
    2023-03-03

最新評論

永修县| 五峰| 巴南区| 新竹县| 会昌县| 奎屯市| 四子王旗| 湖南省| 兰坪| 繁昌县| 清徐县| 安溪县| 普定县| 清镇市| 泾源县| 正镶白旗| 吉木萨尔县| 正安县| 彩票| 万盛区| 太仆寺旗| 津市市| 溧水县| 扎赉特旗| 双城市| 呈贡县| 临汾市| 绥江县| 专栏| 长治县| 长寿区| 兴宁市| 拜城县| 龙川县| 吉安县| 砀山县| 无极县| 新巴尔虎右旗| 方正县| 澳门| 将乐县|