Go基礎-006-04 復合數(shù)據(jù)類型 結(jié)構(gòu)體

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}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容