- 聲明使用結(jié)構(gòu)體
func TestStruct(t *testing.T){
stu := struct{
name string
age int
}{"fangle",18}
t.Log(stu)
}
//result : {fangle 18}
是的上面的代碼等價于
func TestStruct(t *testing.T){
var stu struct{
name string
age int
}
stu.name = "fangle"
stu.age = 18
t.Log(stu)
}
//result : {fangle 18}
這就是一個結(jié)構(gòu)體的聲明了虫啥。聲明了一個有name和age 的結(jié)構(gòu)體爵嗅,并使用慢睡。并不需要type枢泰。
當(dāng)然日常中描融,我們經(jīng)常是這樣用:
type student struct {
name string
age int
}
func TestStruct(t *testing.T){
var stu student
stu.name = "fangle"
stu.age = 18
t.Log(stu)
}
//result : {fangle 18}
使用type只是為了使用方便,給結(jié)構(gòu)體定義一個別名衡蚂。其實結(jié)構(gòu)體的聲明窿克,和type無關(guān)。
- 創(chuàng)建結(jié)構(gòu)體指針
func TestStruct(t *testing.T){
stuPtr := new(struct {
name string
age int
})
stuPtr.name = "fangle" //(*stuPtr).name
stuPtr.age = 18 //(*stuPtr).age
t.Log(stuPtr)
}
//result : &{fangle 18}
結(jié)構(gòu)體指針不能使用 ->
訪問結(jié)構(gòu)體內(nèi)的成員毛甲。結(jié)構(gòu)體指針使用.
訪問結(jié)構(gòu)體成員時會自動轉(zhuǎn)化為(*stuPtr)
- 結(jié)構(gòu)體是值類型
type student struct {
name string
age int
}
func TestStruct(t *testing.T){
stu := student{"fangle",18}
stuImg := stu
stuPtr := &stu
stuPtr.name = "刀斧手何在"
t.Log(stuImg,stu,stuPtr)
}
//result : {fangle 18} {刀斧手何在 18} &{刀斧手何在 18}
在函數(shù)直接傳遞結(jié)構(gòu)體年叮,也是傳遞的結(jié)構(gòu)體的拷貝。這點在后續(xù)的值接收者和指針接收者也會見到
- 包內(nèi)私有成員變量被json序列化時忽略
type student struct {
Name string
age int
}
func TestStruct(t *testing.T){
stu := student{"fangle",18}
jsonData,err:= json.Marshal(stu)
t.Log(string(jsonData),err)
}
//result: {"Name":"fangle"} <nil>
- 使用struct tag 指定序列化規(guī)則
type student struct {
Name string `json:"名字"` //使用名字作為鍵名
age int `json:"age"` //小寫開頭忽略
School string `json:"-"` //主動設(shè)置忽略
Class string `json:"class,omitempty"` //使用class名字玻募,空白時不加入序列化
Group string `json:",omitempty"` //使用默認(rèn)名稱努溃,空白時不加入序列化
}
func TestStruct(t *testing.T){
stu := student{"fangle",18,"就是中學(xué)","","賽艇組"}
stu2 := student{"何在",20,"不是高中","唱詩班",""}
stuList := [...]student{stu,stu2}
jsonData,_:= json.Marshal(stuList)
t.Log(string(jsonData),stu,stu2)
}
//result : [{"名字":"fangle","Group":"賽艇組"},{"名字":"何在","class":"唱詩班"}]
// {fangle 18 就是中學(xué) 賽艇組} {何在 20 不是高中 唱詩班 }