首頁 > 軟體

go語言陣列及結構體繼承和初始化範例解析

2022-04-15 13:01:02

分類

型別名稱長度預設值說明
pointer指標 nil 
array陣列 0 
slice切片 nil引⽤型別
map字典 nil引⽤型別
struct結構體   

陣列

如果要儲存班級裡所有學生的數學成績,應該怎樣儲存呢?可能有同學說,通過定義變數來儲存。但是,問題是班級有80個學生,那麼要定義80個變數嗎?

像以上情況,最好是通過陣列的方式來儲存。

所謂的陣列:是指一系列同一型別資料的集合。

陣列定義

var a [10]int

陣列定義也是通過var關鍵字,後面是陣列的名字a,長度是10,型別是整型。表示:陣列a能夠儲存10個整型數位。也就是說,陣列a的長度是10。

我們可以通過len( )函數測試陣列的長度,如下所示:

 var a [10]int
 fmt.Println(len(a)) //10

當定義完成陣列a後,就在記憶體中開闢了10個連續的儲存空間,每個資料都儲存在相應的空間內,陣列中包含的每個資料被稱為陣列元素(element),一個陣列包含的元素個數被稱為陣列的長度。

注意:陣列的長度只能是常數。以下定義是錯誤的:

var n int = 10
var a [n]int

結構體

package main
import "fmt"
func main(){

	// 1.定義結構體
	type Student struct{
		id int
		name string
		age int
		addr string
}
	//2.結構體初始化1,值的順序與結構體成員的順序保持一致
	chary := Student{1,"chary",18,"上海"}
	fmt.Println(chary) //{1 chary 18 上海}
	//2.結構體初始化2,沒有初始化的成員自動賦值0
	jeff := Student{name:"jeff"}  //{0 jeff 0 }
	fmt.Println(jeff)
	//3.成員使用
	chary.id = 100  //修改
	fmt.Println(chary.id )
	//4.結構體比較,兩個結構體可以使用 == 或 != 運運算元進行比較,但不支援 > 或 <。
	fmt.Println(jeff==chary) //false
	//5.同型別的兩個結構體變數可以相互賦值。
	var user Student
	user = jeff
	fmt.Println(user) //{0 jeff 0 }
}

結構體繼承

一般情況下,定義結構體的時候是欄位名與其型別一一對應,實際上Go支援只提供型別,而不寫欄位名的方式,也就是匿名欄位,也稱為嵌入欄位。

當匿名欄位也是一個結構體的時候,那麼這個結構體所擁有的全部欄位都被隱式地引入了當前定義的這個結構體。

//人
type Person struct {
    name string
    sex byte
    age int
}
//學生
type Student struct {
    Person    //匿名欄位,那麼預設Student就包含了Person的所有欄位
    id int
    addr string
}

結構體初始化

//人
type Person struct {
    name string
    sex byte
    age int
}
//學生
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=%+vn",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=%+vn",s3)
    //部分成員初始化2
    s4 := Student{Person:Person{name:"tom"},id:3}
    //s4 = {Person:{name:tomsex:0age:0}id:3addr:}
    fmt.Printf("s4=%+vn",s4)
}

成員的操作

var s1 Student//變數宣告
//給成員賦值
s1.name = "mike"//等價於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
}
//學生
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("%+vn",s)
    //預設只會給最外層的成員賦值
    //給匿名同名成員賦值,需要顯示呼叫
    s.Person.name = "yoyo"
    //Person:{name:yoyosex:0age:0}id:0addr:name:mike}
    fmt.Printf("%+vn",s)
}

其它匿名欄位

非結構體型別

所有的內建型別和自定義型別都是可以作為匿名欄位的:

type mystr string//自定義型別
type Person struct {
    name string
    sex byte
    age int
}
type Student struct {
    Person    //匿名欄位,結構體型別
    int    //匿名欄位,內建型別
    mystr    //匿名欄位,自定義型別
}
func main() {
    //初始化
    s1 := Student{Person{"mike",'m',18},1,"bj"}
    //{Person:{name:mikesex:109age:18}int:1mystr:bj}
    fmt.Printf("%+vn",s1)
    //成員的操作,列印結果:mike,m,18,1,bj
    fmt.Printf("%s,%c,%d,%d,%sn",s1.name,s1.sex,s1.age,s1.int,s1.mystr)
}

結構體指標型別

type Person struct {    //人
    name string
    sex byte
    age int
}
type Student struct {//學生
    *Person    //匿名欄位,結構體指標型別
    id int
    addr string
}
func main() {
    //初始化
    s1 := Student{&amp;Person{"mike",'m',18},1,"bj"}
    //{Person:0xc0420023e0id:1addr:bj}
    fmt.Printf("%+vn",s1)
    //mike,m,18
    fmt.Printf("%s,%c,%dn",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)
}

結構體欄位實現介面

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語言陣列及結構體繼承和初始化範例解析的詳細內容,更多關於go語言陣列及結構體繼承和初始化的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com