这完美地起作用:
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
package main
import "go_tests/sub"
type Struct struct {
field string
}
func main() {
sub.Fn(Struct{"john"})
}
子/ sub.go
package sub
import "fmt"
func Fn(arg struct{field string}) {
fmt.Println(arg)
}
仅在函数调用中更改Fn(Struct{"john"})
已替换为sub.Fn(Struct{"john"})
。
为什么将函数移动到另一个包会影响类型逻辑?我们将非常感谢您对文档的链接。
答案 0 :(得分:3)
您需要导出结构字段:
type Struct struct {
Field string
}
然后还更改调用以使用导出的字段:
func Fn(arg struct{Field string}) {
fmt.Println(arg)
}
来自language spec(特别是最后一句):
对于结构文字,以下规则适用:
- 键必须是LiteralType中声明的字段名称。
- 不包含任何键的元素列表必须按照声明字段的顺序列出每个struct字段的元素。
- 如果任何元素都有一个键,则每个元素都必须有一个键。
- 包含键的元素列表不需要为每个struct字段都有一个元素。省略的字段为此获得零值 字段。
- 文字可以省略元素列表;这样的文字评估其类型的零值。
- 为属于不同包的结构的非导出字段指定元素是错误的。