无法通过var.MethodName()从另一个包访问方法

时间:2018-08-25 11:08:23

标签: go

我有一个包含与之相关的结构和功能的包装:

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).CheckSomething给出相同的结果。我可以访问s.FirstString和s.SecondString并通过调用使用此方法

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

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

1 个答案:

答案 0 :(得分:1)

在Golang中,方法集定义为:

  

类型可能具有与之关联的方法集。一个方法集   接口类型是它的接口。任何其他类型T的方法集   包含所有以接收者类型T声明的方法。方法集   指针类型* T的所有方法的集合   用接收者* 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
    }
}