为什么通过结构与当前的包字面结构参数的功能不同于相同的功能,从另一个包?(Why passing s

2019-10-22 16:29发布

这工作perferctly:

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

为什么移动功能,另一种包装影响类型的逻辑? 链接的文档可以理解的。

Answer 1:

您需要导出你的结构域:

type Struct struct {
    Field string
}

然后又改为使用导出字段中的呼叫:

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

从语言规范 (特别是最后一句):

对于结构文本适用下列规则:

  • 关键必须在LiteralType声明的字段名。
  • 不包含任何键的元素列表必须列出在哪些领域声明的顺序各领域的结构元素。
  • 如果任一元素的一个关键,每一个元素都必须有一个关键。
  • 包含键的元素列表并不需要为每个结构领域的一个元素。 略领域得到该字段的值为零。
  • 一个文字可省略元素列表; 这样的文字的计算结果为其类型的零值。
  • 它是指定的元件属于不同的包一个结构的非场导出的误差。


文章来源: Why passing struct to function with literal struct parameter from current package differs from the same for function from another package?
标签: struct go