基本介紹
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{}
給結構體定義方法,自定義的類型都可以有方法
方法的聲明和調用
上圖中的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()進行輸出