如果我运行以下代码,则编译并运行正常:
package main
import "fmt"
type Point struct {
x, y int
}
func (p *Point) init() bool {
p.x = 5
p.y = 10
return true
}
func main() {
point := Point{}
point.init()
fmt.Println(point)
}
但是当我将Point struct
移动到$GOPATH
目录中的包时,我收到以下错误:point.init undefined (cannot refer to unexported field or method class.(*Point)."".init)
有人可以向我解释为什么会这样吗?
将Point struct
放入名为class
的程序包后,代码如下所示(错误位于我调用init
方法的第8行):
package main
import "fmt"
import "class"
func main() {
point := class.Point{}
point.init()
fmt.Println(point)
}
答案 0 :(得分:11)
将 init ()重命名为初始()应该可以正常工作!
基本上,所有不以Unicode大写字母开头的东西(函数,方法,结构,变量)都只能在它们的包中看到!
您需要阅读以下语言规范中的更多内容: http://golang.org/ref/spec#Exported_identifiers
相关位:
可以导出标识符以允许从另一个包访问它。如果两者都导出标识符:
- 标识符名称的第一个字符是Unicode大写字母(Unicode类“Lu”);和
- 标识符在包块中声明,或者是字段名称或方法名称。 不会导出所有其他标识符。
醇>
答案 1 :(得分:4)
只导出名称首字母大写的函数/方法
http://golang.org/doc/effective_go.html#commentary
程序中的每个导出(大写)名称......
当我将init
更改为Init
时,一切正常。