Go语言面向对象编程

这篇具有很好参考价值的文章主要介绍了Go语言面向对象编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注:安装教程

上一篇

二、面向对象编程

1、类和方法

1.1、简单实例


func main() {
	//第一种调用方式a.Less(b)
	var a Integer = 1
	println("a是否大于b:", a.Less(2))

	//第二种调用方式Less(a,b)
	println("a是否大于b:", Less(2, 1))
}

type Integer int //定义一个Integer类型

/*
	定义比较函数:第一种写法
*/
func (a Integer) Less(b Integer) bool {
	return a < b
}

/*
	定义比较函数:第二种写法
*/
func Less(a Integer, b Integer) bool {
	return a < b
}

1.2、指针

1、Go语言中的面向对象最为直观,也无需支付额外的成本。如果要求对象必须以指针传递,这有时会是个额外成本,因为对象有时很小(比如4字节),用指针传递并不划算。
只有在你需要修改对象的时候,才必须用指针。它不是Go语言的约束,而是一种自然约束。举个例子


func main() {
	/*
		函数两种区别:
		打印结果如下:
			LessOne:a= 3
			a=: 1
			LessOne:a= 4
			a=: 4
		总结:
			加*表示指针,指向对象a可以修改a的值
			不加*星号,方法内a修改,外部不修改
	*/
	//第一种
	var a Integer = 1
	a.LessOne(2)
	println("a=:", a) //输出a=: 1

	//第二种
	a.LessTwo(3)
	println("a=:", a) //输出a=: 4
}

type Integer int //定义一个Integer类型

/*
定义相加函数:第一种写法
*/
func (a Integer) LessOne(b Integer) {
	a += b
	println("LessOne:a=", a)
}

/*
定义相加函数:第二种写法
*/
func (a *Integer) LessTwo(b Integer) {
	*a += b
	println("LessOne:a=", *a)
}

2、引用类型
如果b的修改不会影响a的值,那么此类型属于值类型。如果会影响a的值,那么此类型是引用类型。


func main() {
	/**
	数组类型赋值b=a是将内容完全复制,如果想表达引用使用指针。
	例:修改b,a不会改变 修改c,a会改变
	*/
	var a = [3]int{1, 2, 3}
	var b = a
	b[1]++
	fmt.Println(a, b) //输出:[1 2 3] [1 3 3]

	var c = &a
	c[1]++
	fmt.Println(a, *c) //输出:[1 3 3] [1 3 3]
}

1.3、结构体定义和初始化

  1. 结构体=类+方法
  2. 在Go语言中,未进行显式初始化的变量都会被初始化为该类型的零值,例如bool类型的零值为false,int类型的零值为0,string类型的零值为空字符串。
  3. 在Go语言中没有构造函数的概念,对象的创建通常交由一个全局的创建函数来完成,以NewXXX来命名,表示“构造函数”:

func main() {
	//初始化
	u1 := new(User)                       //输出:&{  }
	u2 := User{}                          //输出:{  }
	u3 := User{"binshao", "18", "男"}      //输出:{binshao 18 男}
	u4 := User{age: "18", name: "liming"} //输出:{liming 18 }

	//使用构造函数初始化
	u5 := NewUser("zhangsan", "12", "女") //输出:&{zhangsan 12 女}

	fmt.Println(u1)
	fmt.Println(u2)
	fmt.Println(u3)
	fmt.Println(u4)
	fmt.Println(u5)
}

type User struct { //自定义类
	name string
	age  string
	sex  string
}

func (u *User) getIntroduce() string { //定义类中的方法
	return "名字:" + u.name + " 年龄:" + u.age + " 性别:" + u.sex
}

func NewUser(name, age, sex string) *User { //定义类的构造函数
	return &User{name, age, sex}
}

1.4、可见性

大写字母开头,表示可以被其他包访问到,小写字母只能本包访问。
例如:User类型的成员变量就全部被导出了,可以被所有其他引用了User所在包的代码访问到。
成员方法的可访问性遵循同样的规则,User中getUser()方法只能在该类型的包内使用

type User struct {
	Name string
	Sex  string
}

func (u *User) getUser() string {
	return "姓名:" + u.Name + " 性别:" + u.Sex
}

注意:Go语言中符号的可访问性是包一级的而不是类型一级的。在上面的例子中,尽管getUser是User的内部方法,但同一个包中的其他类型也都可以访问到它。这样的可访问性控制很粗旷,很特别,但是非常实用。如果Go语言符号的可访问性是类型一级的,少不了还要加上friend这样的关键字,以表示两个类是朋友关系,可以访问彼此的私有成员。

2、接口

2.1、接口定义与实现

在Go语言中,一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口

/*
例如:
IUser、IGetName、IGetSex、IGetAge中的方法被User全部实现
*/
func main() {
	/*
		尽管User类并没有从这些接口继承,甚至不知道这些接口的存在,但是User类实现了
		这些接口,可以进行赋值,如下:
	*/
	var user1 IUser = new(User)
	var user2 IGetName = new(User)
	var user3 IGetAge = new(User)
	var user4 IGetSex = new(User)

	fmt.Println(user1.getName())
	fmt.Println(user2.getName())
	fmt.Println(user3.getAge())
	fmt.Println(user4.getSex())
}

type User struct {
	Name string
	age  int
	sex  string
}

func (u *User) getName() (name string, err error) {
	return u.Name, nil
}

func (u *User) getAge() (age int, err error) {
	return u.age, nil
}

func (u *User) getSex() (sex string, err error) {

	return u.sex, nil
}

type IUser interface {
	getName() (name string, err error)
	getAge() (age int, err error)
	getSex() (sex string, err error)
}

type IGetName interface {
	getName() (name string, err error)
}

type IGetAge interface {
	getAge() (age int, err error)
}

type IGetSex interface {
	getSex() (sex string, err error)
}

2.2、接口赋值

接口赋值
1、将对象实例赋值给接口;
2、将一个接口赋值给另一个接口。


func main() {

	user := User{"wang", 19, "男"}

	/*
		对象赋值接口
		结论:实例赋值接口是使用"&"
	*/
	var user1 IUser = user  //报错
	var user2 IUser = &user //成功

	/*
		接口赋值接口
		结论:一个接口赋值给另一个接口时,必须实现另一个接口的所有方法

	*/
	var user3 IUser = &user    //成功
	var user4 IGetName = user3 //成功
	var user5 IUser = user4    //报错
	var user6 IGetAge = user4  //报错

}

2.3、接口类型

在Go语言中,还可以更加直截了当地询问接口指向的对象实例的类型,例如文章来源地址https://www.toymoban.com/news/detail-460796.html


func main() {
	var v interface{} = "字符串"
	switch v.(type) {
	case int:
		println("int类型")
	case string:
		println("string类型")
	default:
		println("类型缺省")
	}
}

到了这里,关于Go语言面向对象编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust编程语言入门之Rust的面向对象编程特性

    Rust 受到多种编程范式的影响,包括面向对象 面向对象通常包含以下特性:命名对象、封装、继承 “设计模式四人帮”在《设计模型》中给面向对象的定义: 面向对象的程序由对象组成 对象包装了数据和操作这些数据的过程,这些过程通常被称作方法或操作 基于此定义:

    2023年04月21日
    浏览(53)
  • 【跟小嘉学 Rust 编程】十七、面向对象语言特性

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学 Rust 编程】六、枚举

    2024年02月10日
    浏览(89)
  • 【学习笔记】C#基础 - 由C/C++衍生出来的面向对象的编程语言

    1、基本语法 2、类的命名 必须以 A-Z / _ / @ 开头,不能是数字,之后可以跟 A-Z 、 0-9 、 _ 、 @ 不能包含任何空格或特殊符号,比如 ?-+!#%^*()[]{}.;:\\\"\\\'/ 不能与同名(除非添加 @ 前缀,@不作为标识符本身的一部分),不能与类库同名 必须区分大小写(PascalCase命名法) 3、关

    2024年02月07日
    浏览(55)
  • Go语言编程教程-基本数据类型

    了解布尔类型 了解整数类型 了解浮点数类型 了解复数类型 了解字符串类型 了解字符类型 类型 名称 取值范围 说明 bool 布尔类型 true 或 false 默认值为 false 类型 名称 取值范围 说明 uint8 8位无符号整型 0 ~ 255 uint16 16位无符号整型 0 ~ 65535 uint32 32位无符号整型 0 ~ 4294967295 uint6

    2024年02月04日
    浏览(169)
  • 5 map、结构体、方法、面向对象【Go语言教程】

    1.1 概念及声明 ①概念 基本语法:var map 变量名 map[keytype]valuetype key 可以是什么类型? golang 中的 map,的 key 可以是很多种类型,比如 bool, 数字,string, 指针, channel , 还可以是只包含前面几个类型的 接口, 结构体, 数组 通常 key 为 int 、string 注意: slice, map 还有 function 不可以,

    2024年02月02日
    浏览(51)
  • GO编程语言:简洁、高效、强大的开源编程语言

    在现代软件开发领域,随着应用复杂度的不断提升,开发人员对编程语言的需求也日益增长。GO编程语言,作为一种简洁、高效且具备强大并发能力的新型开源编程语言,逐渐成为了许多开发者的首选。本文将详细介绍GO语言在哪些项目开发中表现出色,以及为什么许多开发者

    2024年02月02日
    浏览(106)
  • Go语言网络编程(socket编程)http编程

    Web服务器的工作原理可以简单地归纳为 客户机通过TCP/IP协议建立到服务器的TCP连接 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“

    2024年02月09日
    浏览(69)
  • Go语言网络编程(socket编程)WebSocket编程

    WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据 在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输 需要安装第

    2024年02月09日
    浏览(77)
  • GO语言网络编程(并发编程)Channel

    1.1.1 Channel 单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。 虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势

    2024年02月09日
    浏览(71)
  • GO语言网络编程(并发编程)select

    1.1.1 select多路复用 在某些场景下我们需要同时从多个通道接收数据。通道在接收数据时,如果没有数据可以接收将会发生阻塞。你也许会写出如下代码使用遍历的方式来实现: 这种方式虽然可以实现从多个通道接收值的需求,但是运行性能会差很多。为了应对这种场景,G

    2024年02月09日
    浏览(89)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包