go语言面向对象之方法
1、实现方法
package main import "fmt" //在面向对象编程中,一个对象其实就是一个简单的值或者一个变量,在这个
//对象中包含一些函数
//这种带有接受者的函数,我们称之为方法,本质上,一个方法
//则是一个和特殊类型关联的函数 //定义一个方法,实现两个数相加 type myint int //传统的定义方式,面向过程的方式定义函数
func Add(a,b myint) myint{
return a + b
} //面向对象的方式定义方法,这个意思是AddOOP这个方法是属于a这个类型的。方法和函数的不同就是方法有一个接受者,这里的接受者就是a这个类型 //这里必须要是自定义类型,比如这里就不能使用int,可以是指针类型和非指针类型 //可以为基础类型添加方法,也可以为结构体类型添加方法,下面的例子就是为基础类型添加方法
func (a myint)AddOOP(b myint) myint{
return a + b
} //为结构体添加类型
type Person struct {
name string
age int
sex byte
} func (p Person )PrintInfo() {
fmt.Println(p.name,p.age,p.sex)
} func main() {
var a myint = 1
var b myint = 1 //调用函数
fmt.Println(Add(a,b))
//2 //调用基础类型的方法
fmt.Println(a.AddOOP(b))
//2 //调用结构体的方法
c := Person{name:"test",age:12,sex:'m'}
c.PrintInfo()
//test 12 109 }
2、指针类型和非指针类型
package main import "fmt" type Person1 struct {
name string
age int
sex byte
} //这种指针类型作为接受者,引用语意
func (p *Person1) PrintPointer() {
(*p).name = "test1"
p.age = 13
(*p).sex = 'f' } func (p Person1) PrintValue() {
p.name = "test2"
p.age = 14
p.sex = 'm' } func main() {
p1 := Person1{name:"abc",age:12,sex:'a'} fmt.Println("调用方法前--->",p1)
//调用方法前---> {abc 12 97}
(&p1).PrintPointer()
fmt.Println("调用方法后--->",p1)
//调用方法后---> {test1 13 102} p2 := Person1{name:"abcd",age:10,sex:'c'} fmt.Println("调用方法前--->",p2)
//调用方法前---> {abcd 10 99} p2.PrintValue()
fmt.Println("调用方法后--->",p2)
//调用方法后---> {abcd 10 99} }
如果指针类型作为方法的接受者,在方法内部修改这个对象,是修改的一份数据,对外部的结构体是有影响的
如果是一个结构体作为方法的接受者,在方法内部修改这个对象,是修改的另外一份数据,对外部的结构体是没有影响的
3、实现继承和重写
package main //go语言的继承
import "fmt" type Person2 struct {
name string
age int
sex byte
} func (p *Person2) PrintValue2() {
fmt.Printf("%s,%c,%d\n",p.name,p.sex,p.age) } //写一个子类,继承Person父类
type Student31 struct {
Person2
id int
addr string } //为Student31这个结构体定义方法,如果父类有一个相同的方法,则相当于重写父类的方法
func (p *Student31) PrintValue3() {
fmt.Printf("%s,%c,%d\n",p.name,p.sex,p.age)
fmt.Printf("%d,%s\n",p.id,p.addr)
} func main() {
p1 := Person2{name:"abc",age:12,sex:'a'} //父类调用父类的方法
(&p1).PrintValue2()
//abc,a,12 p2 := Student31{Person2:Person2{"ddd",12,'f'},id:10,addr:"dddddddddd"}
//子类调用父类的方法
(&p2).PrintValue2()
//ddd,f,12 //子类调用重写的方法
(&p2).PrintValue3()
//ddd,f,12
//10,dddddddddd //如果子类和父类有相同的方法,如果一定要调用父类的方法,则用下面的方式来调用
//p2.Person2.PrintValue2()
}
4、调用方法的三种方法
package main import "fmt" type Person3 struct {
name string
age int
sex byte
} func (p *Person3)Test1() {
//%p表示地址,%v表示值
fmt.Printf("%p,%v",p,p)
} func main() {
p1 := Person3{name:"abc",age:12,sex:'a'} //传统的调用方法
(&p1).Test1()
//0x1f4400d0,&{abc 12 97 //使用go的方法值特性调用方法,也就是说用对象去调用方法
pFunc := p1.Test1 pFunc()
//0x1f43e0d0,&{abc 12 97} //使用方法表达式调用方法,用类的的指针去调用
pFunc2 := (*Person3).Test1 pFunc2(&p1)
//0x1f43e0d0,&{abc 12 97} }
5、定义setter和getter方法
package main import "fmt" type Dog struct {
name string
age int
sex byte
} //封装dog的方法 //setter
func (p *Dog)setName(name string) {
p.name = name
} //getter
func (p *Dog)getName() string {
return p.name
} func (p *Dog)run() {
fmt.Printf("runrun%s\n",p.name)
} func main() {
d1 := Dog{name:"abc",age:12,sex:'a'} d1.setName("dooooo") d1.getName() d1.run()
}
面向对象实现方法
package main import "fmt" type P1 struct {
oop1 string
oop2 string
oop3 int
} type P1_1 struct {
P1
oop4 string
oop5 string
oop6 byte
} //test11_1这个方法属于一个指针变量,而这个指针变量必须指向P1这个结构体
func (p *P1)test11_1(n int) {
p.oop3 += n
fmt.Println(p)
} func (p *P1_1)test11_1(n int) {
p.oop3 += n * 2
fmt.Println(p)
} //test11_1这个方法属于一个结构体,而这个结构体必须是P1这个结构体的实例
//func (p P1)test11_1(n int) {
// p.oop3 += n
// fmt.Println(p)
//} func main() { test11_2 := &P1{oop1:"oop1",oop2:"oop2",oop3:3}
//test11_2 := P1{oop1:"oop1",oop2:"oop2",oop3:3} test11_3 := &P1_1{P1:P1{oop1:"oop1_oop1",oop2:"oop2_oop2",oop3:4},oop4:"oop4_oop4",oop5:"oop5_oop5",oop6:'m'}
//test11_3 := P1_1{P1:P1{oop1:"oop1_oop1",oop2:"oop2_oop2",oop3:4},oop4:"oop4_oop4",oop5:"oop5_oop5",oop6:'m'} test11_2.test11_1(2)
fmt.Println(test11_2) //如果父类和子类有相同的方法,那么子类去调用这个方法,则默认会调用子类的方法
//test11_3.test11_1(3)
//fmt.Println(test11_3) //如果父类和子类有相同的方法,通过下面的方法可以去调用父类的方法
test11_3.P1.test11_1(3)
fmt.Println(test11_3)
}
go语言面向对象之方法的更多相关文章
- C语言面向对象风格编程
前言 本文略谈C面向对象风格编程,如何使用过程式语言去模拟面向对象的特性?C面向对象的方式和形式很多,不一而足,本文的代码形式是模拟部分C++面向对象关键词并赋予其特性,这种方式对于初级程序员比较好理 ...
- Go 语言中的方法,接口和嵌入类型
https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...
- javaScript面向对象继承方法经典实现
转自原文javaScript面向对象继承方法经典实现 JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是Ja ...
- Go语言 - 结构体 | 方法
自定义类型和类型别名 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型 ...
- 原生js使用面向对象的方法开发选项卡实例教程
本教程通过js面向对象的方法来封装一个选项卡的实例,在实例中讲解js的面向对象如何实现功能. 一般封装好的选项卡程序,只需要一个div元素即可.其它元素都是通过json数据来生成,所以封装好的选项卡实 ...
- js面向过程改写成面向对象--通用方法
响亮的标题:一个万能的,保底的.面向过程改写成面向对象的方法 前提朗读:很多刚接触js面向对象的时候都不知道如何能快速的写出一个面向对象的程序,这个是必然的现象,不是每一位学js的一上来就会写面向对象 ...
- [转贴]从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
一.C语言错误处理方法 1.返回值(if … else语句判断错误) 2.errno(linux 系统调用) 3.goto语句(函数内局部跳转) 4.setjmp.longjmp(Do not use ...
- Oracle存储过程中不支持DML语言的解决方法(针对遇见的DROP关键字)
---存储过程中的原语句: ---删除表 DROP TABLE A_NEWTDDATA; --报错 经查询:存储过程不支持DML语言: 解决方法: execute immediate 'DROP TA ...
- Go语言的构建方法总结
趁着近期要换工作的空闲时间,看了一下Go语言,与C++相比,Go语言的确在不少地方轻便了不少,例如:增加了内置的字符串类型.多个返回值.支持协程.简单的构建方法等等.使得在生产效率方面有了不少的提高. ...
随机推荐
- 【Java Web开发学习】Servlet、Filter、Listener
[Java Web开发学习]Servlet 转发:https://www.cnblogs.com/yangchongxing/p/9274739.html 1.Servlet package cn.y ...
- COCI 2012 Inspektor
coci 2012 inspektor 街道由左到右分布着\(N\)个办公室,编号为\(1\)到\(N\),最开始,每个办公室都是空的,一些公司将入住,并赶走办公室里面现有的公司.一人每天会路过一些连 ...
- mysql重点中的重点---->查询中的关键字优先级
1.from 找到表 2.where 拿着where指定的约束条件,去文件/表中取出一条条记录 3.group by 将取出的一条条记录进行分组group by ,如果没有group by ,则整体作 ...
- Vue基础简介
目录 vue基础 一.导入vue 二.vue挂载点 三.vue变量 四.vue事件 五.vue文本指令 六.vue事件指令 七.vue属性指令 vue基础 一.导入vue 补充:vue的语句以及导入j ...
- QQ音乐接口api,包括付费音乐、无损音乐、高品质音乐地址解析接口api
QQ音乐网站所有音乐(包括付费.无损等版权音乐解析接口地址url). mp3 普通高品 http://dl.stream.qqmusic.qq.com/M5000012gqVh4fFvVK.mp3?v ...
- python多线程编程—同步原语入门(锁Lock、信号量(Bounded)Semaphore)
摘录python核心编程 一般的,多线程代码中,总有一些特定的函数或者代码块不希望(或不应该)被多个线程同时执行(比如两个线程运行的顺序发生变化,就可能造成代码的执行轨迹或者行为不相同,或者产生不一致 ...
- Python面向对象-枚举类型enum
枚举类型:在实际问题中,有些变量的值被限定在一个有限的范围内.例如:一个星期有且只有7天,一年有且只有十二个月,一个班每周有6门课程等等.如果把这些量说明为整型.字符串或者其他类型显然是不合适.编程界 ...
- MSSQL - 最佳实践 - 使用SSL加密连接
MSSQL - 最佳实践 - 使用SSL加密连接 author: 风移 摘要 在SQL Server安全系列专题月报分享中,往期我们已经陆续分享了:如何使用对称密钥实现SQL Server列加密技术. ...
- Cocos2dLua3.17.2集成FairyGUI(一)
版本说明:使用cocos2d-lua3.17.2版本 FairyGUI下载好链接地址是:https://github.com/fairygui/FairyGUI-cocos2dx 首先创建cocos项 ...
- 剑指offer-47:不用加减乘除做加法
参考:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html <原码,反码,补码 详解> 题目描述 ...