这完美地工作:package mainimport "fmt"type Struct struct { field string}func Fn(arg struct{field string}) { fmt.Println(arg)}func main() { Fn(Struct{"john"})}但这给出了./main.go:12: cannot use Struct literal (type Struct) as type struct { field string } in argument to sub.Fn:main.gopackage mainimport "go_tests/sub"type Struct struct { field string}func main() { sub.Fn(Struct{"john"})}子/子.gopackage subimport "fmt"func Fn(arg struct{field string}) { fmt.Println(arg)}函数调用的唯一变化是Fn(Struct{"john"})被替换为sub.Fn(Struct{"john"}).为什么将函数移到另一个包会影响类型逻辑?链接到文档将不胜感激。
1 回答
慕桂英546537
TA贡献1848条经验 获得超10个赞
您需要导出结构字段:
type Struct struct { Field string }
然后还更改调用以使用导出的字段:
func Fn(arg struct{Field string}) { fmt.Println(arg) }
从语言规范(特别是最后一句):
对于结构文字,以下规则适用:
键必须是在 LiteralType 中声明的字段名称。
不包含任何键的元素列表必须按照字段声明的顺序为每个结构字段列出一个元素。
如果任何元素有键,则每个元素都必须有键。
包含键的元素列表不需要为每个结构字段都有一个元素。省略的字段获得该字段的零值。
文字可以省略元素列表;这种文字的计算结果为零值。
为属于不同包的结构的非导出字段指定元素是错误的。
- 1 回答
- 0 关注
- 186 浏览
添加回答
举报
0/150
提交
取消