猿问

为什么将结构传递给当前包中带有文字结构参数的函数与另一个包中的函数不同?

这完美地工作:


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"})

}

子/子.go


package sub


import "fmt"


func Fn(arg struct{field string}) {

    fmt.Println(arg)

}

函数调用的唯一变化是Fn(Struct{"john"})被替换为sub.Fn(Struct{"john"}).


为什么将函数移到另一个包会影响类型逻辑?链接到文档将不胜感激。


当年话下
浏览 187回答 1
1回答

慕桂英546537

您需要导出结构字段:type Struct struct {     Field string     }然后还更改调用以使用导出的字段:func Fn(arg struct{Field string}) {     fmt.Println(arg)     }从语言规范(特别是最后一句):对于结构文字,以下规则适用:键必须是在 LiteralType 中声明的字段名称。不包含任何键的元素列表必须按照字段声明的顺序为每个结构字段列出一个元素。如果任何元素有键,则每个元素都必须有键。包含键的元素列表不需要为每个结构字段都有一个元素。省略的字段获得该字段的零值。文字可以省略元素列表;这种文字的计算结果为零值。为属于不同包的结构的非导出字段指定元素是错误的。
随时随地看视频慕课网APP

相关分类

Go
我要回答