现在有一个结构体,其中一个属性组合了另外一个结构体,如下所示:
type User struct {Id int64Name stringAge int64UserInfo
}type UserInfo struct {Phone stringAddress string
}
如果要给 User
结构体的 Phone
和 Address
赋值的话,有两种写法,如下:
func main() {//方式1var user1 Useruser1.Id = 1user1.Name = "张三"user1.Age = 18user1.Phone = "123456789"user1.Address = "北京"jsonData1, _ := json.Marshal(user1)fmt.Println(string(jsonData1))//方式2user2 := User{Id: 1,Name: "张三",Age: 18,UserInfo: UserInfo{Phone: "123456789",Address: "北京",},}jsonData2, _ := json.Marshal(user2)fmt.Println(string(jsonData2))
}
这两种方法都能输出一维结构的json:
注意:下面两种赋值方式都是错的,编译不通过:
//方式2的错误写法1:
user2Error1 := User{Id: 1,Name: "张三",Age: 18,UserInfo{ //报错:Mixture of fields: value and value initializersPhone: "123456789",Address: "北京",},
}//方式2的错误写法2:
user2Error1 := User{Id: 1,Name: "张三",Age: 18,Phone: "123456789", //报错:读取不到此属性 Unknown field 'Phone' in struct literal,下同Address: "北京",
}
如果组合的结构体在另外一个 package 里面,看下面,注意细节:
package commontype ExtraData struct {ExtraId int64ExtraName string
}
type User struct {Id int64Name stringAge int64UserInfo //组合当前package的结构体common.ExtraData //组合其它package的结构体
}
user2 := User{Id: 1,Name: "张三",Age: 18,UserInfo: UserInfo{ //组合当前package的结构体Phone: "123456789",Address: "北京",},ExtraData: common.ExtraData{ //组合其它package的结构体ExtraId: 100,ExtraName: "extraName",},
}
输出结果:
{"Id":1,"Name":"张三","Age":18,"Phone":"123456789","Address":"北京","ExtraId":100,"ExtraName":"extraName"}
注意这两个地方的写法:
如果需要输出二维结构,那么定义的结构体应当是下面这样:
// 定义二维结构体
type User2 struct {Id int64 `json:"id"`Name string `json:"name"`Age int64 `json:"age"`Info UserInfo `json:"info"` //注意:这里需要给组合的结构体前面加一个属性名称
}type UserInfo struct {Phone stringAddress string
}
然后赋值的方式如下:
//输出二维结构
var u1 User2
u1.Id = 2
u1.Name = "李四"
u1.Age = 25
u1.Info.Phone = "131000001"
u1.Info.Address = "上海"
json1, _ := json.Marshal(u1)
fmt.Println(string(json1))u2 := User2{Id: 3,Name: "王五",Age: 39,Info: UserInfo{Phone: "1891234",Address: "深圳",},
}
json2, _ := json.Marshal(u2)
fmt.Println(string(json2))
https://gitee.com/rxbook/go-demo-2025/blob/master/demo/structDemo/struct_combination.go