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