【发布时间】:2013-03-18 01:43:39
【问题描述】:
当我通过公共函数暴露私有类型时,我正在测试 go 的类型可见性并收到意外行为:
package pak
type foo struct { // shoudn't be visible to any other package than pak
Bar string
}
func NewFoo(str string) *foo {
return &foo{str}
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package main
import (
"fmt"
"pak"
)
func main() {
// these lines should be equivalent...
var f = pak.NewFoo("Hello, World!") // this works fine...
var f *pak.foo = pak.NewFoo("Hello, World!") // ERROR: cannot refer to unexported name pak.foo
fmt.Printf("%T\n", f)
fmt.Printf("%s\n", f.Bar) // how does it know about .Bar, if it can't see pak.foo?
}
没有明确声明f的类型,它会打印:
*pak.foo
Hello, World!
但使用*pak.foo 编译失败。
为什么在这两种情况下都不失败?
(这个question有点相关,但它没有回答这个问题)
【问题讨论】:
标签: types go visibility