golang面向对象
一、方法
1、方法是作用在指定的数据类型上,和指定的数据类型绑定,因此自定义类型都可以有方法,而不仅仅是struct;
2、方法的申明和格式调用:
package main
import (
"fmt"
)
type Person struct{
Name string
}
func (p Person) test(){
fmt.Println(p.Name)
}
func main(){
p := Person{Name: "Tom"}
p.test()
}
注意:结构体对象传入方法中是值传递,和函数传递参数一样。如果在方法中改变结构体变量的值,可以通过结构体指针的方式来处理。
package main
import (
"fmt"
)
type Person struct{
Name string
}
func (p *Person) test(){
fmt.Println((*p).Name)
}
func main(){
p := &Person{Name: "Tom"}
p.test()
}
二、封装:
1、什么是封装?
封装就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只有通过被授权的操作方法才能对字段就行操作。
2、封装的好处:
1)隐藏实现细节;
2)可以对数据进行验证,保证数据安全合理。
3、golang中如何实现封装?
package main
import (
"fmt"
)
type person struct{
Name string
age int
}
func NewPerson(name string) *person {
p := person{
Name: name,
}
return &p
}
func (p *person) SetAge(age int){
if age > 0 && age < 150{
(*p).age = age
} else {
fmt.Println("对不起,你输入的年龄范围不正确。")
}
}
func (p *person) GetAge() int {
return (*p).age
}
func main(){
p := NewPerson("Tom")
p.SetAge(22)
fmt.Println(p.Name)
fmt.Println(p.GetAge)
fmt.Println(*p)
}
// Tom
// 0xbc5a60
// {Tom 22}
三、继承
当多个结构体存在相同的属性和方法时可以从这些结构体中抽象出结构体,在该结构体中定义这些相同的属性和方法,其它的结构体中不需要重新定义这些属性和方法,只需要嵌入一个匿名结构体即可。
也就是说,在golang中如果一个struct嵌套了另一个匿名结构体,那个这个struct可以直接访问这个匿名结构的属性和方法,从而实现了继承特性。
继承的优点:
1、提高代码的复用性和扩展性;
package main
import (
"fmt"
)
type Animal struct{
Age int
Weight float32
}
func (an *Animal) Shout(){
fmt.Println("我可以大声喊叫")
}
func (an *Animal) ShowInfo(){
fmt.Println("动物的年龄是:%v,动物的体重是:%v", an.Age, an.Weight)
}
type Cat struct{
Animal
}
func (c *Cat) scratch(){
fmt.Println("我是小猫,我可以挠人。")
}
func main(){
cat := &Cat{}
cat.Animal.Age = 3
cat.Animal.Weight = 10.6
cat.Animal.Shout()
cat.Animal.ShowInfo()
cat.scratch()
}
注意事项:
1、结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写和小写的字段、方法都可以使用;
2、匿名结构体字段访问可以简化;
3、当结构体和匿名结构体有相同的字段和方法时,编译器采用就近访问原则进行访问,如果希望访问匿名结构体属性和方法,可以通过匿名结构体名来区分;
4、golang中支持多继承;
package main
import (
"fmt"
)
type A struct{
a1 string
a2 int
}
type B struct{
b1 string
b2 int
}
type C struct{
A
B
}
func main(){
c := C{A{"a1", 10}, B{"b1", 20}}
fmt.Println(c)
}
5、如果嵌入的匿名结构体有相同的属性名或方法,则在访问时需要通过匿名结构体类型名来区分;
6、结构体的匿名字段可以是基本数据类型;
package main
import (
"fmt"
)
type A struct{
a1 string
a2 int
}
type B struct{
b1 string
b2 int
}
type C struct{
A
B
int
}
func main(){
c := C{A{"a1", 10}, B{"b1", 20}, 888}
fmt.Println(c.a1)
fmt.Println(c.a2)
fmt.Println(c.b1)
fmt.Println(c.b2)
fmt.Println(c.A.a1)
fmt.Println(c.A.a2)
fmt.Println(c.B.b1)
fmt.Println(c.B.b2)
fmt.Println(c.int)
}
//a1
//10
//b1
//20
//a1
//10
//b1
//20
//888
7、嵌套匿名结构体后,可以在创建结构体变量时直接指定各个匿名结构体字段的值;
8、嵌入匿名结构体的指针也是可以的;
9、结构体的字段可以是结构体类型的。
package main
import (
"fmt"
)
type A struct{
a1 string
a2 int
}
type B struct{
b1 string
b2 int
}
type C struct{
A
B
int
}
type D struct{
a int
b B
}
func main(){
d := D{11, B{"BB", 66}}
fmt.Println(d)
fmt.Println(d.b.b1)
}
// {11 {BB 66}}
// BB
golang面向对象的更多相关文章
- golang面向对象和interface接口
一. golang面向对象介绍 1.golang也支持面向对象编程,但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.2.golang没有类(class),golang语言的结合体(struc ...
- Golang面向对象编程-struct(结构体)
Golang面向对象编程-struct(结构体) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是面向对象编程 面向对象编程(Object Oriented Program ...
- golang 面向对象编程
概述 Golang语言的面向对象与c++,py等语言有所不同,是由于Golang不支持继承:与上述支持聚合和继承的面向对象的语言不同,Golang只支持聚合(也叫做组合)和嵌入.聚合和嵌入的区别: t ...
- 【GoLang】golang 面向对象编程 & 面向接口编程
005.面向对象&接口编程 1 面向函数编程 1.1 将数据作为参数传递到函数入参 1.2 对象与函数是分离的 2 面向对象编程 2.1 使用者看起来函数作为对象的属性而非参数 2.2 函数属 ...
- golang面向对象实现
面向对象编程三大特点:封装.继承.多态. 1. 构造函数 Go不支持构造器.如果某类型的零值不可用,需要提供NewT(parameters)函数,用来初始化T类型的变量.按照Go的惯例,应该把创建T类 ...
- golang面向对象分析
说道面向对象(OOP)编程, 就不得不提到下面几个概念: 抽象 封装 继承 多态 其实有个问题Is Go An Object Oriented Language?, 随便谷歌了一下, 你就发现讨论这个 ...
- golang面向对象初识
struct是变量的集合 interface是方法的集合 struct与interface都支持匿名字段, 换言之, 支持组合实现继承. golang的struct与C++的class一样, 只能声明 ...
- golang 面向对象
深入理解GO语言的面向对象_Golang_脚本之家 https://www.jb51.net/article/94030.htm 深入理解GO语言的面向对象 更新时间:2016年10月04日 10:4 ...
- Golang面向对象_继承
package main import "fmt" type Person struct { name string //名字 sex byte //性别 age int //年龄 ...
- Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现
前言: Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多; 学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子; ...
随机推荐
- KingbaseES V8R6备份恢复案例之--删除test数据库后sys_backup.sh备份
案例说明: KingbaseES V8R6通过sys_backup.sh执行物理备份,默认sys_backup.sh执行备份初始化时,需要连接test数据库进行身份的认证:在一些生产环境为了安全需求, ...
- GIN and RUM 索引性能比较
gin索引字段entry构造的TREE,在末端posting tree|list 里面存储的是entry对应的行号. 别无其他信息.rum索引,与GIN类似,但是在posting list|tree的 ...
- 大家都能看得懂的源码之 ahooks useVirtualList 封装虚拟滚动列表
本文是深入浅出 ahooks 源码系列文章的第十八篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 简介 提供虚拟化列表能力的 Hook,用于解决展示海量数据渲染时 ...
- 1-VSCode搭建GD32开发环境
一.使用VSCode开发GD32的原因 1-单片机开发用的最多的IDE为Keil,而Keil为商用软件,并非开源,而且只支持windows环境,介于当前关系,有断供的风险在. 2-其他IDE类似第1条 ...
- 8_Quartz
一. 引言 1.1 简介 Quartz: http://www.quartz-scheduler.org/ 是一个 定时任务调度框架 ,比如我们遇到这样的问题 想在30分钟后, 查看订单是否支付, 未 ...
- 秋初 WAMP 集成环境 v2.1
基于QT的PHP集成开发环境v2.1 https://gitee.com/xiaqiuchu/wamp-integrated-environment 界面预览 已实现功能 服务的启动.关闭.重启. p ...
- C#.NET ORM 如何访问 Access 数据库 [FreeSql]
最近很多 .net QQ 群无故被封停,特别是 wpf 群几乎全军覆没.依乐祝的 .net6交流群,晓晨的 .net跨平台交流群,导致很多码友流离失所无家可归,借此机会使用一次召唤术,有需要的请加群: ...
- css三角形文本框
<style type="text/css"> .triangle{/* 三角形图片位置 */ background-image: url(img/traintop.p ...
- 新零售SaaS架构:中央库存系统架构设计
近年来,越来越多的零售企业大力发展全渠道业务.在销售额增长上,通过线上的小程序.直播.平台渠道等方式,拓展流量变现渠道.在会员增长方面,通过多样的互动方式,全渠道触达消费者,扩大会员规模.而全渠道的库 ...
- capability参数配置
前言 本文为在霍格沃兹测试开发学社的学习经历分享 简介 功能:配置 Appium 会话,告诉 Appium 服务器需要自动化的平台的应用程序 形式:键值对的集合,键对应设置的名称,值对应设置的值 主要 ...