一、方法

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面向对象的更多相关文章

  1. golang面向对象和interface接口

    一. golang面向对象介绍 1.golang也支持面向对象编程,但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.2.golang没有类(class),golang语言的结合体(struc ...

  2. Golang面向对象编程-struct(结构体)

    Golang面向对象编程-struct(结构体) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是面向对象编程 面向对象编程(Object Oriented Program ...

  3. golang 面向对象编程

    概述 Golang语言的面向对象与c++,py等语言有所不同,是由于Golang不支持继承:与上述支持聚合和继承的面向对象的语言不同,Golang只支持聚合(也叫做组合)和嵌入.聚合和嵌入的区别: t ...

  4. 【GoLang】golang 面向对象编程 & 面向接口编程

    005.面向对象&接口编程 1 面向函数编程 1.1 将数据作为参数传递到函数入参 1.2 对象与函数是分离的 2 面向对象编程 2.1 使用者看起来函数作为对象的属性而非参数 2.2 函数属 ...

  5. golang面向对象实现

    面向对象编程三大特点:封装.继承.多态. 1. 构造函数 Go不支持构造器.如果某类型的零值不可用,需要提供NewT(parameters)函数,用来初始化T类型的变量.按照Go的惯例,应该把创建T类 ...

  6. golang面向对象分析

    说道面向对象(OOP)编程, 就不得不提到下面几个概念: 抽象 封装 继承 多态 其实有个问题Is Go An Object Oriented Language?, 随便谷歌了一下, 你就发现讨论这个 ...

  7. golang面向对象初识

    struct是变量的集合 interface是方法的集合 struct与interface都支持匿名字段, 换言之, 支持组合实现继承. golang的struct与C++的class一样, 只能声明 ...

  8. golang 面向对象

    深入理解GO语言的面向对象_Golang_脚本之家 https://www.jb51.net/article/94030.htm 深入理解GO语言的面向对象 更新时间:2016年10月04日 10:4 ...

  9. Golang面向对象_继承

    package main import "fmt" type Person struct { name string //名字 sex byte //性别 age int //年龄 ...

  10. Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现

    前言: Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多; 学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子; ...

随机推荐

  1. day33-线程基础03

    线程基础03 6.用户线程和守护线程 用户线程:也叫工作线程,当线程的任务执行完或者通知方法结束.平时用到的普通线程均是用户线程,当在Java程序中创建一个线程,它就被称为用户线程 守护线程(Daem ...

  2. 操作服务器的神奇工具Tmux

    Tmux 是什么? 会话与进程 命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称"窗口"),在里面输入命令.用户与计算机的这种临时的交互,称为一次 ...

  3. Gitea 1.17.2 | 带来视觉提升、完善资源校验、加强安全性等42项优化

    Gitea 1.17.2 合并了 42 个 Pull Request,现已正式发布,我们建议所有用户升级到此版本.您可以到阅读原文了解更详细的介绍. 致谢:@zeripath 为 Gitea 贡献了诸 ...

  4. 基于 Gitea 服务端渲染的 Jupyter Notebooks

    本指南将向您展示如何通过配置外部渲染器来使 Gitea 呈现 Jupyter Notebooks.当然,你还可以根据本指南来为你的 Gitea 实例配置其他类型的文档渲染器,甚至是二进制文件!相信Gi ...

  5. LFS(Linux From Scratch)构建过程全记录(一):准备工作

    写在前面 本人修学了一门课,名曰<操作系统课程设计>,其任务为基于LFS以编译源代码的方式制作一个基本的Linux操作系统,并且编写在linux下的GUI软件. 本操作系统构建的全过程将分 ...

  6. 使用PBIS将Linux加入域

     使用PBIS将Linux加入域 很多企业已经部署的微软的活动目录,为了方便管理,可以把Linux加入域.网上流传了很多把Linux加入域的方法,感觉比较复杂,并且似乎并没有真正的加入域.只是完成 ...

  7. Python数据科学手册-机器学习: k-means聚类/高斯混合模型

    前面学习的无监督学习模型:降维 另一种无监督学习模型:聚类算法. 聚类算法直接冲数据的内在性质中学习最优的划分结果或者确定离散标签类型. 最简单最容易理解的聚类算法可能是 k-means聚类算法了. ...

  8. Lua脚本在Redis事务中的应用实践

    使用过Redis事务的应该清楚,Redis事务实现是通过打包多条命令,单独的隔离操作,事务中的所有命令都会按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断.事务中的命令要么全部 ...

  9. Prometheus样本采集器汇总

    系统基本信息 Linux Servers: Exporter https://github.com/prometheus/node_exporter Dashboard https://grafana ...

  10. Prometheus组件介绍

    Prometheus Server Prometheus Server是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询. Prometheus Server可以通过静态配 ...