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
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值