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的影子; ...
随机推荐
- zabbix_agentd断断续续端无法访问问题记录
问题现象: zabbix监控上出现zabbix_agentd无法访问,但是实际上zabbix_agentd是存活状态 每隔一段时间就会出现这样的情况 问题原因 zabbix_agentd端任务较多,活 ...
- 八皇后代码C语言版本
y = x + b -> y-x = b 主对角线上,行下标与列下标之差相等y = -x + b -> y+x = b 副对角线上,行下标与列下标之和相等主对角线 ...
- G&GH05 删除文件和.gitignore
注意事项与声明 平台: Windows 10 作者: JamesNULLiu 邮箱: jamesnulliu@outlook.com 博客: https://www.cnblogs.com/james ...
- 一文搞懂容器运行时 Containerd
文章转载自:https://www.qikqiak.com/post/containerd-usage/ 在学习 Containerd 之前我们有必要对 Docker 的发展历史做一个简单的回顾,因为 ...
- 详解JS中 call 方法的实现
摘要:本文将全面的,详细解析call方法的实现原理 本文分享自华为云社区<关于 JavaScript 中 call 方法的实现,附带详细解析!>,作者:CoderBin. 本文将全面的,详 ...
- VMware安装Win11+WSA子系统和使用教程
VMware安装Win11+WSA子系统和使用教程 作者:Sna1lGo 时间:2022/9/29 下载相关文件: Win11镜像:Download Windows 11 (microsoft.com ...
- 20220929-ArrayList扩容机制源码分析
示例代码 public class ArrayListSource { public static void main(String[] args) { ArrayList arrayList = n ...
- 几个Caller-特性的妙用
System.Runtime.CompilerServices命名空间下有4个以"Caller"为前缀命名的Attribute,我们可以将它标注到方法参数上自动获取当前调用上下文的 ...
- Charles的安装与使用
Charles是一款抓包工具,可以用来截取和发送手机APP上的各种请求 在windows上安装Charles,确保手机和电脑在同一个WIFI下,加上一些配置,就可以抓取手机上的APP请求 有能力的同学 ...
- Hive Beeline 命令行参数
[hadoop@hive ~]$ beeline --help[中文版] The Beeline CLI 支持以下命令行参数: Option Description --autoCommit=[tru ...