请问Go语言中,是否可以进行在不同的代码文件中一起定义一个"类"(struct模拟类)?

我在看到Go语言定义一个类,以及类的方法是如下方式定义的:
a.go文件:

package main

import "fmt"

// 类外函数
func outsideFunction() {
    fmt.Println("This is outside function.")
}

type MyStruct struct{}

// 类内方法(接收者为结构体)
func (m MyStruct) classMethod() {
    fmt.Println("This is class method.")
}

func main() {
    outsideFunction()
    myObj := MyStruct{}
    myObj.classMethod()
}

1、请问这个是否是一个约定俗成的定义Go类的方式?(定义方法在定义类(struct)之后)

2、如果我在另外一个文件b.go里面引入MyStruct,并且再在b.go里面添加方法classMethod2

// 类内方法(接收者为结构体)
func (m MyStruct) classMethod2() {
    fmt.Println("This is class method2.")
}

是否可以呢?

阅读 1.8k
avatarAI BotBETA

1. 请问这个是否是一个约定俗成的定义Go类的方式?(定义方法在定义类(struct)之后)

答案:在Go语言中,由于它并没有传统面向对象编程中的“类”概念,而是使用结构体(struct)和接口(interface)来模拟面向对象编程的特性。因此,说“定义Go类的方式”可能不太准确,但确实可以通过在结构体上定义方法来模拟类的方法。关于方法的定义位置,并没有严格的约定要求方法必须定义在结构体定义之后。你可以将方法定义在结构体定义之前或之后,或者甚至在不同的文件中,只要遵循Go语言的包和可见性规则即可。

2. 如果我在另外一个文件b.go里面引入MyStruct,并且再在b.go里面添加方法classMethod2

答案是的,这是完全可以的。在Go中,你可以在不同的文件中定义同一个包(package)下的结构体(或其他类型)的方法。但是,你需要在b.go文件的开头声明与a.go相同的包名(在这个例子中是package main),并且确保b.go文件与a.go文件在同一个包内。然后,你就可以在b.go文件中为MyStruct类型添加新的方法了。

b.go文件示例:

package main

import "fmt"

// 类内方法(接收者为结构体)
func (m MyStruct) classMethod2() {
    fmt.Println("This is class method2.")
}

请注意,由于Go语言的作用域和可见性规则,MyStruct的类型定义(在这个例子中是type MyStruct struct{})必须在任何使用该类型作为接收者的方法之前被声明,无论是在同一个文件还是不同的文件中。但是,只要MyStruct的声明在方法使用之前是可见的(即在同一包内),那么你就可以在不同的文件中为MyStruct添加新的方法。

2 个回答
✓ 已被采纳
请问这个是否是一个约定俗成的定义Go类的方式?(定义方法在定义类(struct)之后)

这是常见方式。结构体可以被视为类的模拟,而方法则是与结构体关联的函数。通常情况下会先定义结构体,然后再定义与之相关联的方法:

package main

import "fmt"

type MyStruct struct{}

func (m MyStruct) classMethod() {
    fmt.Println("This is class method.")
}

func main() {
    myObj := MyStruct{}
    myObj.classMethod()
}

如果我在另外一个文件b.go里面引入MyStruct,并且再在b.go里面添加方法classMethod2:

// 类内方法(接收者为结构体)
func (m MyStruct) classMethod2() {
    fmt.Println("This is class method2.")
}

是否可以呢?

可以。Go允许在同一包中的不同文件中为结构体添加多个方法。这样做,classMethod2方法将与MyStruct结构体关联。可以在其他地方使用:

func main() {
    myObj := MyStruct{}
    myObj.classMethod()
    myObj.classMethod2()
}

这不是约定俗成,而是强制要求 —— 必须先定义结构体,才能定义以该结构体为接收者的方法。

但对是否需要在同一个文件内则没有要求。不过要是当 OOP 去写的话,出于可维护性的考虑一般都会写在一起。

推荐问题
宣传栏