如何为导入的嵌入结构体字面量赋值?报错求助
Go跨包嵌入结构体初始化报错原因及解决方法
先看单个文件中可正常运行的代码:
package main import "fmt" type foo struct { field1 string field2 string } type bar struct { foo field3 string field4 string } func main() { fooBar := bar{ foo{ "apples", "banana", }, "spam", "eggs", } fmt.Printf("%#v\n", fooBar) }
但拆分为跨包项目结构后:
rootproject ├── magazine │ ├── address.go │ └── employee.go └── main.go
magazine/address.go代码:
package magazine type Address struct { Street string City string State string PostalCode string }
magazine/employee.go代码:
package magazine type Employee struct { Name string Salary float64 Address }
main.go代码:
package main import ( "fmt" "magazine" ) func main() { employee := magazine.Employee{ Name: "pogi", Salary: 69420, magazine.Address{ Street: "23 pukinginamo st.", City: "bactol city", State: "betlog", PostalCode: "23432", }, } fmt.Printf("%#v\n", employee) }
运行时会触发报错:mixture of field:value and value elements in struct literal
原因解析
同一个包内,嵌入结构体的类型名就是它的隐式字段名,直接用foo{...}这种值初始化是合法的——Go会自动识别这是给嵌入的foo字段赋值。
但跨包场景下,嵌入的结构体类型定义写的是Address(而非magazine.Address),所以它对应的隐式字段名是不带包名的Address。此时你写magazine.Address{...},Go会把它当成一个未指定字段名的值初始化项,但前面已经用了Name:、Salary:这种键值对形式,混合两种初始化方式就会触发报错。
解决方法
方法1:指定隐式字段名(推荐)
给嵌入的结构体指定不带包名的隐式字段名Address,用键值对方式赋值:
package main import ( "fmt" "magazine" ) func main() { employee := magazine.Employee{ Name: "pogi", Salary: 69420, Address: magazine.Address{ Street: "23 pukinginamo st.", City: "bactol city", State: "betlog", PostalCode: "23432", }, } fmt.Printf("%#v\n", employee) }
方法2:全值初始化(不推荐)
如果不想写字段名,需严格按照结构体字段的定义顺序来初始化,不能混合键值对:
employee := magazine.Employee{ "pogi", 69420, magazine.Address{ "23 pukinginamo st.", "bactol city", "betlog", "23432", }, }
内容的提问来源于stack exchange,提问作者greg pinakapoging nilalang sa
相关产品推荐
相关产品推荐

