Go Can';t通过var.MethodName()从另一个包访问方法

Go Can';t通过var.MethodName()从另一个包访问方法,go,Go,我有一个包,其中包含一些与之相关的结构和功能: package samplepkg type SampleStruct struct { FirstString string SecondString string } func init() { // some operations } func CheckSomething(s *SampleStruct) bool { // check something } 现在我尝试在另一个包中运行此函数: im

我有一个包,其中包含一些与之相关的结构和功能:

package samplepkg

type SampleStruct struct {
    FirstString string
    SecondString string
}

func init() {
    // some operations
}

func CheckSomething(s *SampleStruct) bool {
    // check something
}
现在我尝试在另一个包中运行此函数:

import (
    "MyProject/samplepkg"
)

func testFunc() {
    var s = samplepkg.SampleStruct{"a", "b"}
    if s.CheckSomething() {
        // do some operations
    }
}
但是我得到一个错误,s.CheckSomething是未定义的。(&s)。选中某个内容会给出相同的结果。我可以访问s.FirstString和s.SecondString,也可以通过调用

if samplepkg.CheckSomething(&s) {
    // do some operations
}

但我觉得可以用更好的方式写。我知道Go不是面向对象的语言,但这样的方法调用可能吗?

在Golang中,方法集定义为:

类型可能有与其关联的方法集。方法集 接口类型是它的接口。任何其他类型T的方法集 由接收器类型T声明的所有方法组成。方法集 对应指针类型的*T是所有方法的集合 用receiver*T或T声明(也就是说,它还包含方法 一组T)。进一步的规则适用于包含嵌入字段的结构, 如结构类型一节所述。任何其他类型都有一个 空方法集。在方法集中,每个方法必须具有唯一的 非空方法名

这是一个错误,因为在调用函数时使用了带方法的指针接收器。因此,当定义为方法时,将函数更改为:

func init() {
    // some operations
}

func(s *SampleStruct) CheckSomething() bool {
    // check something
}
或者在调用方法时,它应该是带有参数
SampleStruct
的函数,如下所示

import (
    "MyProject/samplepkg"
)

func testFunc() {
    var s = &samplepkg.SampleStruct{"a", "b"}
    if CheckSomething(s) {
        // do some operations
    }
}

你应该使用方法而不是函数,然后你就可以做
s了。CheckSomething
ChedkSomething()
不是方法接收器,所以你显然不能在
s
上调用它。我的错,我还没有在Golang中区分方法和函数。现在可以用了,谢谢