我有一个包含与之相关的结构和功能的包装:
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并不是面向对象的语言,但是这样的方法调用可能吗?
答案 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
}
}