小编典典

为什么从当前程序包将结构传递给具有文字struct参数的函数与从另一个程序包传递的函数不同?

go

这很正常:

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 / sub.go

package sub

import "fmt"

func Fn(arg struct{field string}) {
    fmt.Println(arg)
}

函数调用中唯一的更改是Fn(Struct{"john"})被替换sub.Fn(Struct{"john"})

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


阅读 250

收藏
2020-07-02

共1个答案

小编典典

您需要导出您的struct字段:

type Struct struct {
    Field string
}

然后还将调用更改为使用导出的字段:

func Fn(arg struct{Field string}) {
    fmt.Println(arg)
}

根据语言规范(特别是最后一句话):

对于结构文字,以下规则适用:

  • 键必须是在LiteralType中声明的字段名称。
  • 不包含任何键的元素列表必须按声明字段的顺序为每个struct字段列出一个元素。
  • 如果任何元素具有键,则每个元素都必须具有键。
  • 包含键的元素列表不需要为每个结构字段都具有一个元素。省略的字段将获得该字段的零值。
  • 文字可能会省略元素列表;这样的文字对其类型求值为零。
  • 为属于不同包的结构的非导出字段指定元素是错误的。
2020-07-02