自学内容网 自学内容网

Go语言之面向对象

面向对象

go 语言没有类的概念,用自己的一套方式实现面向对象,通过结构体实现封装,通过结构体绑定函数实现方法,以组合的方式实现继承,(java之父也曾透露过他最想改的就是继承,觉得java继承有点重)更加解耦和轻量,利用interface{}实现多态,需要要继承和实现关键字

结构体

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,是值类型,通过将函数与结构体变量绑定实现方法(当然函数可以与命令类型绑定实现方法)

// 定义人员信息
type Person struct {
    Name string
    Age uint
    Sex bool //true 代表男, false 代表女
}
// 定义班级信息,并继承人员
type Student struct {
    Person
    class string
}

// 绑定结构体
func (p Person) Say(content string){
        p.Age=100 //修改拷贝的结构体的值
    fmt.Println(p.Name, content)
}
// 绑定结构体
func (p *Person) SetName(name string) {
    p.Name = name
}


func main() {
per := Person{"大红", 34, true}
per.Say("welcome !")
per.SetName("大明")
per.Say("welcome !")
stu := Student{per, "一年一班"}
stu.Name = "大蓝"
stu.Say("hello!")
}

// 输出
大红 welcome !
大明 welcome !
大蓝 hello!

实际项目中,大部分都会绑定指针类型;既节省了资源,又同步了对象的数据

interface:接口

把具有共性的方法定义在一起,任何类型实现了这些方法就是实现了这个接口。

  • 接口嵌套接口实现接口继承
  • 接口也可以嵌入到结构中
  • 指针接收者实现接口的方式只能支持赋值结构体指针给接口变量,而值接收者实现接口的方式都可以,因为Go语言中有对指针类型变量求值的语法糖

结构可以嵌套结构体或者接口,接口只能嵌套接口

type Downloader interface {
Download()
}

type Implement interface {
download(url string)
save()
}
type Template struct {
url string
Implement
}
type HttpDownloader struct {
Template
}

// 模板方法
func (t Template) Download() {
fmt.Println("prepare download...")
t.download(t.url)
fmt.Println("finish download...")
t.save()
}
func (t Template) save() {
fmt.Println("save ...")
}
func (HttpDownloader) download(url string) {
fmt.Println("http download " + url + "....")
}
func NewHttpDownloader(url string) Downloader {
downloader := &HttpDownloader{Template{url: url}}
downloader.Template.Implement = downloader
return downloader
}

结构可以嵌套结构体或者接口,接口只能嵌套接口

interface{}:空接口

空接口。没有方法的接口,所有类型都至少实现了0个方法,所以所有类型都实现了空接口。interface{} 类型常用于函数参数,表示可以传递任意类型,GO运行时会执行类型转换(如果需要)。内置fmt包打印方法用到这个参数

type Person struct {
Name string
Age  uint
Sex  bool //true 代表男, false 代表女
}

type Student struct {
Person
class string
}

func PrintType(v ...interface{}) {
for _, valType := range v {
switch valType.(type) { //类型断言
case int:
fmt.Println("int")
case bool:
fmt.Println("bool")
case string:
fmt.Println("string")
case *Person:
fmt.Println("*Person")
default:
fmt.Println("unknow")
}
}
}

func main() {
PrintType("string", 56, &Person{Name: "张三", Age: 22, Sex: true}, true, &Student{})
}

// 输出
string
int
*Person
bool
unknow

原文地址:https://blog.csdn.net/qq_31667253/article/details/140630226

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!