Oop 导入的结构方法不工作

Oop 导入的结构方法不工作,oop,methods,struct,go,Oop,Methods,Struct,Go,如果我运行以下代码,一切都会编译并运行良好: 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) } 但是当我将点结构移动到

如果我运行以下代码,一切都会编译并运行良好:

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)
}
但是当我将
点结构
移动到
$GOPATH
目录中的包时,我得到了以下错误:
Point.init未定义(不能引用未报告的字段或方法类。(*Point)。“”.init)

有人能解释一下为什么会发生这种情况吗

一旦我将
点结构
放入名为
class
的包中,代码如下所示(错误出现在第8行,我调用
init
方法):


仅导出名称首字母大写的函数/方法

程序中每个导出(大写)的名称


当我将
init
更改为
init
时,一切正常。

init()重命名为init()应该可以
基本上,所有不以Unicode大写字母开头的东西(函数、方法、结构、变量)都将在它们的包中可见

您需要在此处阅读语言规范中的更多内容:

相关位:

可以导出标识符以允许从另一个包访问它。如果出现以下两种情况,则导出标识符:

  • 标识符名称的第一个字符是Unicode大写字母(Unicode类“Lu”);及
  • 标识符在包块中声明,或者是字段名或方法名。 不会导出所有其他标识符

  • 很酷,这是一个比我好得多的来源,但您应该始终包含源代码中的相关引用,因为链接可能会成为invalidIt的惯用用法,即编写函数
    NewPoint
    ,从各种参数构造点,而不是事后调用
    Init
    。确实,但我在RPC包中使用此函数,它只允许注册一个对象,因此我不得不这样做将init作为一个方法
    package main
    
    import "fmt"
    import "class"
    
    func main() {
        point := class.Point{}
        point.init()
        fmt.Println(point)
    }