这很正常:
package main import "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.go:12: cannot use Struct literal (type Struct) as type struct { field string } in argument to sub.Fn
main.go
package main import "go_tests/sub" type Struct struct { field string } func main() { sub.Fn(Struct{"john"}) }
sub / sub.go
package sub import "fmt" func Fn(arg struct{field string}) { fmt.Println(arg) }
函数调用中唯一的更改是Fn(Struct{"john"})被替换sub.Fn(Struct{"john"})。
Fn(Struct{"john"})
sub.Fn(Struct{"john"})
为什么将功能移至另一个包会影响类型逻辑?到文档的链接将不胜感激。
您需要导出您的struct字段:
type Struct struct { Field string }
然后还将调用更改为使用导出的字段:
func Fn(arg struct{Field string}) { fmt.Println(arg) }
根据语言规范(特别是最后一句话):
对于结构文字,以下规则适用: 键必须是在LiteralType中声明的字段名称。 不包含任何键的元素列表必须按声明字段的顺序为每个struct字段列出一个元素。 如果任何元素具有键,则每个元素都必须具有键。 包含键的元素列表不需要为每个结构字段都具有一个元素。省略的字段将获得该字段的零值。 文字可能会省略元素列表;这样的文字对其类型求值为零。 为属于不同包的结构的非导出字段指定元素是错误的。
对于结构文字,以下规则适用: