博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang 学习笔记(05)—— 面向对象编程
阅读量:6073 次
发布时间:2019-06-20

本文共 2492 字,大约阅读时间需要 8 分钟。

前言

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

你可能感兴趣的文章
eureka集群基于DNS配置方式
查看>>
SpringData 基于SpringBoot快速入门
查看>>
page-break-after:always不能正常工作
查看>>
P1155 双栈排序(二分图染色)
查看>>
YAML 语法小结
查看>>
JMS、AMQP和MQTT主要特性
查看>>
STM32-串行SPI nor
查看>>
【LCS】POJ1458Common Subsequence
查看>>
不变量,临界区和谓词
查看>>
iOS 之应用性能调优的25个建议和技巧
查看>>
C#中如何利用操作符重载和转换操作符
查看>>
EEPlat PaaS中的多租户数据隔离模式
查看>>
Android面试题集
查看>>
编译原理——中间代码生成
查看>>
『Collections』namedtuple_具名元组
查看>>
查看Redis信息和状态
查看>>
EntityFramework Core 1.1+ Backing Fields(返回字段)
查看>>
初学者如何理解网络协议?
查看>>
鹅厂优文 | 决策树及ID3算法学习
查看>>
JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)
查看>>