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的影子; ...
随机推荐
- 【pytest官方文档】解读- 如何自定义mark标记,并将测试用例的数据传递给fixture函数
在之前的分享中,我们知道可以使用yield或者return关键字把fixture函数里的值传递给test函数. 这种方法很实用,比如我在fixture函数里向数据库里插入必要的测试数据,那我就可以把相 ...
- 【开源打印组件】vue-plugin-hiprint初体验
vue-plugin-hiprint的学习与应用 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习 ...
- 无线WIFI连接
家里的无线网络覆盖一直不全, 最近想改善一下.买了一个mercury的小路由器MW156RM 其实,我还是不理解WDS, repeater, bridge模式有什么区别. 目标就是实现最少的改动,保持 ...
- Python数据分析教程(二):Pandas
Pandas导入 Pandas是Python第三方库,提供高性能易用数据类型和分析工具 Pandas基于NumPy实现,常与NumPy和Matplotlib一同使用 两个数据类型:Series, Da ...
- CVE-2022-39197(CobaltStrike XSS <=4.7)漏洞复现
最新文章更新见个人博客 漏洞说明 根据9.20日CobaltStrike官方发布的最新4.7.1版本的更新日志中介绍,<=4.7的teamserver版本存在XSS漏洞,从而可以造成RCE远程代 ...
- docker垃圾处理
1 查找docker文件夹 find / -name docker 2 列举文件夹大小 du -h --time --max-depth=1 . df -h df -TH 3 Docker占用磁盘空间 ...
- Elastic:用 Docker 部署 Elastic Stack
文章转载自:https://elasticstack.blog.csdn.net/article/details/100919273 前提条件 首选需要在主机上安装好docker和docker-com ...
- python csv写入多列
import csv import os def main(): current_dir = os.path.abspath('.') file_name = os.path.join(current ...
- .Net 7内容汇总(3)--反射优化
反射这玩意,一直以来都是慢的代名词.一说XXX系统大量的反射,好多人第一印象就是会慢. 但是呢,我们又不得不使用反射来做一些事情,毕竟这玩意可以说啥都能干了对吧. It's immensely pow ...
- centos 安装mysql 8.0
在home下新建一个mysql文件夹 cd /home mkdir mysql cd mysql 1.首先上传文件,把文件传到 /home/mysql下 链接:https://pan.baidu.co ...