Golang 学习笔记(05)—— 面向对象编程

前言

golang是面向过程的语言,go中没有类,单go支持面向对象的编程,go中的struct就像其他语言中的类;go里没有继承,但可以通过组合来实现。

struct

结构体是一种自定义类型,是不同数据的几何体,struct是值类型,通常用来定义一个抽象的数据对象,比如学生,可以有姓名,年龄,班级的数据构成。

定义

type Student struct{ Name string Age int Class string } 实例化

通过New创建实例 stu := new(Student) stu.Name = "Chain" stu.Age = 23 stu.Class = "3-2" 按照顺序提供初始化值 stu := Student{"Chian", 23, "3-2"} 按照field:value的方式初始化 stu := Student{Name:"Chain", Age:23, Class:"3-2"} 成员方法

定义成员方法的格式如下:

func (变量名 结构体类型) 函数名(参数列表) (返回类型列表) 例如:

func (s Student) Display() { fmt.Printf("Name=%s, Age=%d, Class=%s\n", s.Name, s.Age, s.Class) } 调用的时候直接用实例名点函数名即可例如:

stu := Student{"Chian", 23, "3-2"} stu.Display() 注意

golang中没有显式的定义字段或函数的访问权限,那么,访问权限是怎么定义的呢? 字段或函数的首字母大写的话,则为public权限 字段或函数的首字母小写的话,则为private权限 interface

接口是一系列操作的集合,是一种约束。我们可以把它看作与其他对象通讯的协议。任何非接口类型只要拥有某接口的全部方法,就表示它实现了该接口,go中无需显式的在该类上添加接口声明。 例如:

package main

import ( "fmt" )

func main(){ var stu IStudent stu = &Student{"chain", 23} stu.Display() fmt.Println(stu.GetName()) fmt.Println(stu.GetAge()) }

type Student struct{ Name string Age int }

func (stu *Student) Display(){ fmt.Println("i am student") }

func (stu *Student) GetName() string{ return stu.Name }

func (stu *Student) GetAge() int{ return stu.Age }

type IStudent interface{ Display() GetName() string GetAge() int } [图片上传失败...(image-f37b74-1514188348248)]

面向对象的三大特性

学过面向对象的同学应该都知道面向对象的三大特性:封装,继承,多态。 这三大特性在golang中如何实现呢? 请看以下3个例子

封装

package main

import ( "fmt" )

func main(){ stu := new(Student) stu.SetName("chain") fmt.Println(stu.GetName()) }

type Student struct{ name string }

func (stu *Student) SetName(name string){ stu.name = name }

func (stu *Student) GetName() string{ return stu.name } [图片上传失败...(image-e4668b-1514188348248)]

继承

package main

import ( "fmt" )

func main(){ stu := Student{"chain"} fmt.Println(stu)

aStu := AStudent{Student{"chain"}, 23}
fmt.Println(aStu)
复制代码

}

type Student struct{ name string }

type AStudent struct{ Student Age int } [图片上传失败...(image-6a9fd1-1514188348248)]

多态

package main

import ( "fmt" )

func main(){ var stu IStudent stu = &AStudent{} stu.Display()

stu = &BStudent{}
stu.Display()
复制代码

}

type AStudent struct{

}

func (stu *AStudent) Display(){ fmt.Println("i am a student") }

type BStudent struct{

}

func (stu *BStudent) Display(){ fmt.Println("i am b student") }

type IStudent interface{ Display() } [图片上传失败...(image-79e86e-1514188348248)]

作者:ChainZhang 链接:https://www.jianshu.com/p/d8216baffa27 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://juejin.im/post/5a6d96e86fb9a01cbe659024

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值