1. 程式人生 > 其它 >十八、GO語言的結構體(struct)

十八、GO語言的結構體(struct)

基本介紹

  1.從概念或叫法放上看:結構體的欄位=屬性=field

  2.欄位是結構體的一個組成部分,一般是基本資料型別、陣列,也可以是引用型別

  3.在建立一個結構體變數後,如果沒有給欄位賦值,都對應一個預設值,具體值與欄位型別相關。如果是切片或者map之類的型別,則需要make後才可以使用該欄位,因為只是聲明瞭欄位,並沒有分配記憶體空間

  4.不同結構體變數的欄位是獨立的,互不影響,一個結構體變數欄位的更改不會影響另外的結構體

  5.結構體預設是值型別,使用時會預設進行值拷貝,比如賦值給另一個結構體或者進行函式傳遞的時候,如果想要同步改變,則可以進行指標傳遞

結構體的基本語法

  var person struct{

    name string

    age int

  }

結構體的宣告,推薦使用第一種或者第二種

  方式一

  var person Person

  person.name = "張三"

  person.age = 18

  方式二

  var person Person = Person{}

  person.name = "張三"

  person.age = 18

  方式三,結構體指標

  var person *Person = new(Person)

  person.name = "張三"

  person.age = 18

  方式四,結構體指標

  var person *Person = &Person{}

  person.name = "張三"

  person.age = 18

  方式五

  person:=Person{}

  person.name="張三"   person.age=18
  結構體指標訪問欄位的標準方式應該是:(*結構體指標).欄位名,比如(*person).Name= "張三",但GO語言做了一個簡化,也支援 結構體指標.欄位名,比如person.Name="張三"。更加符合程式設計師的使用習慣,GO編譯器底層對person.Name做了轉化(*person).Name 結構體使用的注意事項   1.結構體所有欄位在記憶體中是連續的   2.結構體是使用者單獨定義的型別,和其他型別進行轉換時需要有完全相同的欄位名(欄位數量,欄位型別,欄位名稱)   3.結構體進行type重新定義(相當於取別名),Golang認為是新的資料型別,但是相互間可以強轉   4.在結構體的每個欄位上,可以寫一個tag,該tag可以通過反射機制獲取,常見的使用場景就是序列化和反序列化
  

給結構體定義方法,自定義的型別都可以有方法

方法的宣告和呼叫

  

上圖中的test()就是Person的方法,

如方法內部不需要使用該該結構體,可以省略p

func (Person) test(){

  fmt.Print("person.name",p.name)

}

方法的注意事項

  1.結構體型別是值型別,在方法呼叫中,遵守值型別的傳遞機制,是值拷貝傳遞方式

  2.如希望在方法中修改結構體變數的值,可以通過結構體指標的方式來處理,如func (p *Person) test()

  3.golang中的方法作用在指定的資料型別是行,因此自定義型別都可以有方法,而不僅僅是struct,比如int,float32等。

  4.方法的訪問範圍控制的規則和函式一樣,方法名手寫字母小寫,只能在本包訪問,方法首字母大寫,可以在本包和其他包訪問

  5.如果一個變數實現了String()這個方法,那麼fmt.Println預設會呼叫這個變數的String()進行輸出