go 语言面向对象编程、go语言类、方法、多态实例

本篇主要分享go语言的面向对象编程小实例,加深对go语言面向对象编程部分内容认识。


  • 在 Go 语言中没有类(Class)的概念,Go 语言中可以使用结构体(Structs)对属性进行封装,结构体就像是类的一种简化形式。

  • 方法
    Go 语言中方法(Methods):Go 方法是作用在接收者(receiver)上的一个函数,接收者是某种类型的变量。因此方法是一种特殊类型的函数。

  • 继承
    在 Go 语言中没有 extends 关键字,它使用在结构体中内嵌匿名类型的方法来实现继承。

(1)、类和方法

package main

import (
        "fmt"
)

type Person struct {//定义属性内容
        name string
        sex byte
        age int
}

func (tmp Person) PrintInfo() {//定义Person的方法
        fmt.Println("tmp = ", tmp)
}

func (p *Person) SetInfo (n string, s byte, a int) {//定义指针型的方法
        p.name = n
        p.sex = s
        p.age = a
}

func main() {

        p := Person{"mike",'m', 18} //初始化 Person 值
        p.PrintInfo()				//调用方法
        
        var p1 Person
        (&p1).SetInfo("bike", 'n', 17) //调用方法
        p1.PrintInfo()        
}

运行结果如下:

robot@ubuntu:~/workspace-go/src/mothed$ go run mothed.go 
tmp =  {mike 109 18}
tmp =  {bike 110 17}

(2)、简单方法实例

package main

import (
        "fmt"
)

type long int  // 定义int 类型 long

func (tmp long) Add(other long) long { //给 long 对象添加具有返回值的方法
        return tmp+other;
}

func main() {
        var a long = 12
        r := a.Add(3)
        fmt.Println("result = ",r)
}

(3). 指针变量的方法

package main

import (
	"fmt"
)

type Person struct {
	name string
	sex byte
	age int
}

func (p *Person) SetInfoPointer (n string, s byte, a int) {
	p.name = n
	p.sex = s
	p.age = a
	fmt.Printf("SetInfoPointer &p = %p\n",p)
}

func (p Person) SetInfoValue (n string, s byte, a int){
	p.name =n
	p.sex = s
	p.age = a
	fmt.Printf("SetInfoValue &p = %p\n", &p)
}

func main() {

	var s1 Person = Person{"golan", 'm',24}
	fmt.Printf("&s1 = %p\n",&s1)

	s1.SetInfoValue("mike",'m',33)
	fmt.Println("s1 = ",s1)

	var s2 Person = Person{"golan",'m',24}
	fmt.Printf("s2 = %p\n",&s2)
	(&s2).SetInfoPointer("bike",'m',22)
	fmt.Println("s2 = ",s2)
}

运行结果:

robot@ubuntu:~/workspace-go/src/mothed$ go run mothed.go 
&s1 = 0xc000026040
SetInfoValue &p = 0xc000026060
s1 =  {golan 109 24}
s2 = 0xc0000260a0
SetInfoPointer &p = 0xc0000260a0
s2 =  {bike 109 22}

(4). 方法的继承 & 重写

package main
import (
	"fmt"
)

type Person struct {
	name string
	sex byte
	age int
}

type Worker struct {
	Person
	id int
	addr string
}


func (p *Person) PrintInfo () {
	fmt.Printf("name = %s, sex = %c,age = %d \n", p.name, p.sex, p.age)
}

func (w *Worker) PrintInfo() {
	fmt.Printf("name = %s, sex = %c, age = %d, addr = %s \n",w.name, w.sex, w.age, w.addr)
}

func main() {

	w := Worker{Person{"golan",'m',23},100,"haidian beijing"}

	w.PrintInfo()
	fmt.Printf("\n\r")

	w.Person.PrintInfo()
	fmt.Printf("\n\r")

	f := w.Person.PrintInfo
	f()

    f1 := (*Worker).PrintInfo
    f1(&w)

}

输入内容如下

robot@ubuntu:~/workspace-go/src/mothed$ go run mothed.go 
name = golan, sex = m, age = 23, addr = haidian beijing 

name = golan, sex = m,age = 23 

name = golan, sex = m,age = 23 
name = golan, sex = m, age = 23, addr = haidian beijing 

(5). 接口实现多态

package main

import (
        "fmt"
)

type Square struct {
        side float32
}

type Rectangle struct {
        length, width float32
}

type Shaper interface {
        Area() float32
}

func (sq *Square) Area() float32 {
        return sq.side * sq.side
}

func (r *Rectangle) Area() float32 {
        return r.length * r.width
}

func main () {

        r := &Rectangle{10,2}
        q := &Square{10}

        fmt.Printf("r.area = %f\n",r.Area())
        fmt.Printf("q.area = %f\n",q.Area())

        shapes := []Shaper{r,q}

        for n, _ := range shapes {
                fmt.Println("图形数据: ", shapes[n])
                fmt.Println("它的面积: ", shapes[n].Area())
        }

}

输出内容

robot@ubuntu:~/workspace-go/src/mothed$ go run mothed.go 
r.area = 20.000000
q.area = 100.000000
图形数据:  &{10 2}
它的面积:  20
图形数据:  &{10}
它的面积:  100

参考链接
https://zhuanlan.zhihu.com/p/94625212

上一篇:离散LEAD I ECG实现的数据采集模块(用于ECG系统)_电工基础电路图讲解


下一篇:SpringBoot高级用法(三)