📅  最后修改于: 2023-12-03 15:31:01.972000             🧑  作者: Mango
Golang 是一种面向对象的编程语言,但是它没有类的概念,取而代之的是结构体和方法。
结构体是一种自定义类型,可以包含多个不同的数据类型。可以通过下面的语法定义结构体:
type Person struct {
Name string
Age int
Address Address
}
在上面的例子中,我们定义了一个名为 Person
的结构体。它有三个成员变量:Name
和 Age
都是基本类型(字符串和整数),Address
是另一个结构体类型。
方法是一种与对象相关联的函数。在 Golang 中,方法是以结构体为接收器的函数。这意味着方法可以访问结构体中的成员变量。
下面是一个定义方法的例子:
func (p *Person) SayHello() {
fmt.Printf("Hello, my name is %s and I'm %d years old\n", p.Name, p.Age)
}
在上面的例子中,我们定义了一个名为 SayHello
的方法。它的接收器是一个指向 Person
结构体的指针。(注意:指针接收器是必需的,这样我们才能修改结构体的成员变量。)
方法的调用方式与普通函数略有不同:
func main() {
p := Person{Name: "Alice", Age: 20}
p.SayHello()
}
虽然 Golang 没有类的概念,但是它可以通过嵌套结构体来实现类似于继承的功能。
例如,我们有两个结构体 Car
和 ToyotaCar
:
type Car struct {
Name string
Price int
}
type ToyotaCar struct {
Car
Model string
Year int
}
上面的例子中,ToyotaCar
包含一个 Car
结构体,这意味着 ToyotaCar
可以继承 Car
中的成员变量和方法。
Golang 中使用大小写字母来确定变量或函数是否可以在其他包中被访问。如果以大写字母开头,那么该变量或函数就可以在其他包中使用;如果以小写字母开头,那么就不能在其他包中使用。
例如,我们定义一个名为 Person
的结构体和一个 GetName
方法:
package mypackage
type Person struct {
name string
age int
}
func (p *Person) GetName() string {
return p.name
}
在上面的例子中,我们把 Person
结构体和 GetName
方法放在了 mypackage
包下。由于 Person
结构体和 GetName
方法都是以小写字母开头,因此它们不能在其他包中被访问。
Golang 中的多态是通过接口实现的。接口是一组方法的集合,只包含方法的定义而没有实现。在 Golang 中,如果一个类型实现了某个接口的所有方法,那么它就可以被当做该接口类型来使用。
例如,我们定义了一个名为 Animal
的接口:
type Animal interface {
Speak() string
}
于是,我们可以定义一个名为 Dog
的结构体,并实现 Animal
接口的 Speak
方法:
type Dog struct {}
func (d *Dog) Speak() string {
return "Woof!"
}
因为 Dog
结构体实现了 Animal
接口的 Speak
方法,所以它可以被当做 Animal
类型来使用。
虽然 Golang 没有类的概念,但是它通过结构体和方法等特性来实现面向对象编程。这些特性使得编程更加简洁、灵活,同时也保留了面向对象编程的核心思想。