十八、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()進行輸出

  
方法和函數的區別
  1.調用方式不一樣
    函數的調用方式:函數(實參列表)
    方法的調用方式:變量.方法名(實參列表)
  2.對於普通函數,接受者爲值類型,不能講治鎮類型數據直接傳遞,反之亦然
  3.對於方法(如struct的方法),接受者爲值類型時,可以直接用指針類型的變量調用方法,反過來同樣也可以
 
  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章