Go进阶 | 青训营

86 阅读2分钟

Go语言既不是一个面向过程的语言,也不是面向对象的语言,相对更加灵活,所以更倾向于让开发者考虑如何使用它。 下面我们聊聊Go如何实现面向对象

Go是怎样做到面向对象

通过结构体实现面向对象

首先Go的结构体如下

type struct_variable_type struct {
   member definition
   member definition
   ...
   member definition
}

//两种定义方式
variable_name := structure_variable_type {value1, value2...valuen}
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}

结构体的使用和C/C++基本类似,这里我们不去讨论,我们看看Go是如何实现面向对象的。 Go是通过将一个方法绑定到一个结构体上来实现面向对象,那个结构体等价于类实现的方法等价于自己的成员方法。下面看一个简单的例子

package main  
import "fmt"  

type User struct {  
    name string  
    id int  
}  
  
func (user *User) sayMsgAndRetId(msg string) int {  
    fmt.Println("id: ", user.id, " name: ", user.name, " say: ", msg)  
    return user.id  
}  
  
func main() {  
    user := User{  
    name: "zhangsan",  
    id: 1,  
    }  
    user.sayMsgAndRetId("hello golang")  
}

这里我们注意第九行,在函数名字前面有一个User结构体指针,当然这里传不传指针和C/C++的解释一样;这里相当于将say函数绑定到结构体上了,结构体可以通过struct_name.say直接使用。

这里实现了多态

package main  
  
import "fmt"  
  
// Humaner 定义一个接口了类型  
type Humaner interface {  
    // 方法只有声明,没有实现,由别的类型(自定义类型)实现  
    sayhi()  
}  
  
type Student struct {  
    name string  
    id int  
}  
  
// Student类型实现了此方法  
func (temp *Student) sayhi() {  
    fmt.Printf("Student[%s,%d]sayhi\n", temp.name, temp.id)  
}  
  
type Teacher struct {  
    addr string  
    group string  
}  
  
// Teacher类型实现了此方法  
func (temp *Teacher) sayhi() {  
    fmt.Printf("Teacher[%s,%s]sayhi\n", temp.addr, temp.group)  
}  
  
type Mystr string  
  
// Mystr 实现了这个方法  
func (temp *Mystr) sayhi() {  
    fmt.Printf("Mystr[%s]sayhi\n", *temp)  
}  
  
// WhoSayHi 定义一个普通函数,函数的参数为接口类型 只有一个函数,可以有不同表现(多态)  
func WhoSayHi(i Humaner) {  
    i.sayhi()  
}  
  
func main() {  
    s := &Student{"mike", 666}  
    t := &Teacher{"bj", "go"}  
    var str Mystr ="hello mike"  

    // 调用同一函数,不同表现,多态,多种形态  
    WhoSayHi(s)      //Student[mike,666]sayhi
    WhoSayHi(t)      //Teacher[bj,go]sayhi
    WhoSayHi(&str)   //Mystr[hello mike]sayhi
}