1.類型
結(jié)構(gòu)體,用于描述一個整體結(jié)構(gòu)的數(shù)據(jù)類型,在 Go 中,主要充當 OOP 的功能。
類型標識符:
struct {
m1 m1T
m2 m2T
}
其中 struct 是結(jié)構(gòu)體的關鍵字,m,就是 member 成員,也被稱作 p,property 屬性。
一個結(jié)構(gòu)體,由多個成員 member 構(gòu)成,每個 member 都是用戶自定義的,因此該結(jié)構(gòu)體,也是用戶自定義的數(shù)據(jù)類型。 該自定義,指的是結(jié)構(gòu)上的自定義。(與數(shù)組切片,僅僅定義元素類型和長度是不同的)。
一個結(jié)構(gòu)體,體現(xiàn)的一個整體的數(shù)據(jù)的各個部分。例如:
struct {
name string
age int
}
表示一個用戶,具備了 name 和 age 兩個屬性。同時也意味著,只要是一個用戶,就一 定要具備該兩個屬性。
在定義結(jié)構(gòu)體時,往往會給結(jié)構(gòu)體類型,起一個名字,稱之為類型定義(別名),便于 之后方便的使用該結(jié)構(gòu)體。類型的標識符(類型名)。
典型的結(jié)構(gòu)體定義類型如下:
type Person struct {
ID string
Name string
age int
}
若沒有起名字的結(jié)構(gòu)體,稱之為匿名結(jié)構(gòu)體。 注意,以上語法,僅僅是定義了類型,而不是數(shù)據(jù)。僅僅是個結(jié)構(gòu)。
2.字面量
語法: 類型標識符 {
成員的初始化
}
成員的初始化語法,有如下幾個方案:
- StructType {},使用成員的零值進行初始化
- StructType {mValue1, mValue2 .. mValueN},依據(jù)成員聲明順序,將全部成員進行初始化。
- StructType {mN:mValueN},對特定成員變量進行初始化,其他成員變量使用類型 零值。
代碼示例:
type Person struct {
ID string
Name string
age int
}
//fmt.Println(Person)
fmt.Println(Person{})
fmt.Println(Person{"42007", "Hank", 42})
//fmt.Println(Person{"Hank", "42007",}) // too few values in Person literal
fmt.Println(Person{ID: "42008"})
3.結(jié)構(gòu)體類型,類型名和類型數(shù)據(jù)概念區(qū)分
結(jié)構(gòu)體類型,是對類型的描述 。
類型名,對該類型起的一個名字,便于訪問。
類型數(shù)據(jù),基于該類型,創(chuàng)建的數(shù)據(jù)。
類型 和 數(shù)據(jù)間的關系,相當于圖紙和建筑物的關系。
4.成員訪問 .
點運算符,用于完成對結(jié)構(gòu)體數(shù)據(jù)成員的訪問。
語法: 結(jié)構(gòu)體.成員變量 (范圍限定符)
代碼示例:
type Person struct {
ID string
Name string
age int
}
p1 := Person{"42007", "Hank", 42}
fmt.Println(p1.Name) // Hank
5.匿名結(jié)構(gòu)體
沒有為結(jié)構(gòu)體類型起名字,直接去使用。
匿名結(jié)構(gòu)體的使用,通常需要立即使用其成員聲明語法,得到數(shù)據(jù)。
代碼:
//匿名結(jié)構(gòu)體
p := struct {
ID string
Name string
}{
"007",
"Hank",
}
fmt.Println(p, p.Name) // {007 Hank} Hank
整體上的語法,就是匿名結(jié)構(gòu)體的字面量語法。
若需要相同的結(jié)構(gòu),則還需使用匿名結(jié)構(gòu)體語法,可見匿名結(jié)構(gòu)體僅僅適用于臨時使用一次的結(jié)構(gòu)。
若結(jié)構(gòu)體使用了多次,不建議使用匿名結(jié)構(gòu)體,應該使用具名結(jié)構(gòu)體(起名字的機構(gòu)體)。
6.結(jié)構(gòu)體是值類型
復制時,值會被拷貝!
代碼:
p := struct {
ID string
Name string
}{
"007",
"Hank",
}
p2 := p
p2.Name = "Firelinks"
fmt.Println(p, p2)
// {007 Hank} {007 Firelinks}