为什么使用当前包中的literal struct参数将struct传递给函数的原因与另一个包中的函数相同?

时间:2015-04-15 17:41:23

标签: 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.go

package sub

import "fmt"

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

仅在函数调用中更改Fn(Struct{"john"})已替换为sub.Fn(Struct{"john"})

为什么将函数移动到另一个包会影响类型逻辑?我们将非常感谢您对文档的链接。

1 个答案:

答案 0 :(得分:3)

您需要导出结构字段:

type Struct struct {
    Field string
}

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

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

来自language spec(特别是最后一句):

  

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

     
      
  • 键必须是LiteralType中声明的字段名称。
  •   
  • 不包含任何键的元素列表必须按照声明字段的顺序列出每个struct字段的元素。
  •   
  • 如果任何元素都有一个键,则每个元素都必须有一个键。
  •   
  • 包含键的元素列表不需要为每个struct字段都有一个元素。省略的字段为此获得零值   字段。
  •   
  • 文字可以省略元素列表;这样的文字评估其类型的零值。
  •   
  • 为属于不同包的结构的非导出字段指定元素是错误的。
  •