Golang学习之路5-结构体/类封装等使用


前言

go语言支持类的操作,但是没有class关键字,使用struct来模拟类、结构体。类支持封装、绑定方法、继承等


一、结构体

结构体是由零个或多个任意类型的值聚合成的实体,它可以用于将数据分组为一个单元而不是将它们中的每一个作为单独的值。

1.声明结构体

用关键字 type 和 struct 用来定义结构体。

type StructName struct{
    FieldName type
}

2.匿名结构体

以在不创建新数据类型的情况下声明结构,直接给予变量赋值。

func main() {
	ppl := struct {
		name   string
		age    int
		gender string
		score  float64
	}{}
	fmt.Println(ppl.name)
	ppl.name = "ppl"
	fmt.Println(ppl.name)
}

完整代码

package main

import "fmt"

type Student struct {
	// 定义结构体
	name   string
	age    int
	gender string
	score  float64
}

func main() {
	// 所有字段都写完整值value,可不写key
	ppl := Student{
		"ppl",
		18,
		"男",
		60.5, // 最后一字段写上逗号,不然花括号}要同一行
	}
	// 修改值
	ppl.name = "我的新名字哈哈哈"
	fmt.Println(ppl)
	// 部分字段有值时,需要写上:key:value,无值的默认为空值
	ppl1 := Student{
		name:  "PPL",
		score: 060.6,
	}
	fmt.Println(ppl1, "age:", ppl1.age, " gender:", ppl1.gender)
	prt := &ppl1 // 指针
	fmt.Println(prt.name)
	fmt.Println((*prt).name)

	// 匿名结构体
	ppl2 := struct {
		name   string
		age    int
		gender string
		score  float64
	}{}
	fmt.Println(ppl2.name)
	ppl2.name = "ppl"
	fmt.Println(ppl2.name)
}

在这里插入图片描述


二、类

1.封装及绑定

如下结构体模拟类,有着属性,绑定了Eat方法

type Person struct {
	// 成员属性
	name   string
	age    int
	gender string
	score  float64
}

// 类绑定方法,绑定后可使用成员属性
func (p Person) Eat() {
	p.name = "gsxl"
	fmt.Println("不使用指针 Eat func 修改为:", p.name)
}

注意使用指针时及不使用指针时的区别:

  • 不使用指针修改:只会改变当前成员属性,原始属性不会改变
  • 使用指针修改,原始属性也跟着改变

完整代码

package main

import "fmt"

type Person struct {
	// 成员属性
	name   string
	age    int
	gender string
	score  float64
}

// 类绑定方法,绑定后可使用成员属性
func (p Person) Eat() {
	p.name = "gsxl"
	fmt.Println("不使用指针 Eat func 修改为:", p.name)
}

func (p *Person) Work() {
	p.name = "广深小龙"
	fmt.Println("使用指针 Work func 修改为:", p.name)
}

func main() {
	ppl := Person{
		name:   "ppl",
		age:    18,
		gender: "男",
		score:  66.23,
	}
	// 不使用指针修改:只会改变当前成员属性,原始属性不会改变
	ppl.Eat()
	fmt.Println(ppl.name)

	// 使用指针修改,原始属性也跟着改变
	ppl.Work()
	fmt.Println(ppl.name)
}

在这里插入图片描述

2.继承

1、类的继承,直接写超类名称

type Human struct {
	// 超类/父类
	name   string
	age    int
	gender string
}

type Teacher struct {
	Human // 继承,直接写超类
	school string
	gender int
}

2、如果是这样不算是继承,是嵌套

type Human struct {
	// 超类/父类
	name   string
	age    int
	gender string
}

type Teacher struct {
	h      Human // 继承,直接写超类
	school string
	gender int
}

完整代码

package main

import "fmt"

type Human struct {
	// 超类/父类
	name   string
	age    int
	gender string
}

func (h *Human) Eat() {
	fmt.Println("Eat func:", h.name)
}

type Student1 struct {
	// 并非继承,只是嵌套类
	h      Human
	school string
}

type Teacher struct {
	Human // 继承,直接写超类
	school string
	gender int
}

func main() {
	s := Student1{
		h: Human{
			name:   "ppl",
			age:    25,
			gender: "男",
		},
		school: "广西大学",
	}
	s.h.Eat() // 嵌套调用

	t := Teacher{}
	t.name = "漂漂亮"
	fmt.Println(t.name)
	t.Eat() // 继承调用,我们在Teacher并没有创建Eat方法,但是被继承了默认创建了同名方法及属性

	// 定义了相同的属性,只能调用自己的,如果想调用父类那么需要.父类.属性
	fmt.Println("子类的gender:", t.gender)
	fmt.Println("父类的gender:", t.Human.gender)
}

在这里插入图片描述

3.多态及接口

在学习多态前我们先了解下接口interface,支持任何类型。
1、interface
接口类型是一种抽象类型。通常用来接收任何类型参数,如下:

/*
	1.关键字定义接口:interface
	2.interface接收任意数据类型
*/
func checkType(values ...interface{}) {
	for _, value := range values {
		switch v := value.(type) {
		case string:
			fmt.Println("this type is string:", v)
		case int:
			fmt.Println("this type is int:", v)
		case bool:
			fmt.Println("this type is bool:", v)
		default:
			fmt.Println("this type is default:", v)
		}
	}
}

在这里插入图片描述
2、多态
多态可以理解:传入不同对象,调用相同方法,实现不同效果。
下面举个例子:猫、狗都属于动物都需要吃食物,那么接口中都调用了Eat(),猫与狗都有Eat()的方法,只是食物不一样,那么根据不同对象进行对应的Eat()。

package main
import "fmt"
/*
多态:传入不同对象,调用相同方法,实现不同效果
1.定义一个接口,设计好需要调用接口,可多个
2.任何实现了此接口,都可赋值,从而实现多态
*/

type Animal interface {
	// 定义一个接口,接口可以多个函数,不可有实现
	Eat()
}

type Dog struct {
	name string
	eat  string
}

type Cat struct {
	name string
	eat  string
}

func (d *Dog) Eat() {
	fmt.Println("this is Dog eat", d.eat)
}

func (c *Cat) Eat() {
	fmt.Println("this is Cat eat", c.eat)
}

func main() {
	// 定义一个接口类变量
	var eat Animal
	
	// 动物狗
	dog := Dog{
		name: "小狗钱钱",
		eat:  "狗粮",
	}
	eat = &dog
	eat.Eat()

	// 动物猫
	cat := Cat{
		name: "招财猫",
		eat:  "猫粮",
	}
	eat = &cat
	eat.Eat()
}

在这里插入图片描述

4.类访问权限

go语言中都是遵循以下规则:

  • pubic:首字母大写 (对内外均可调用)
  • private:首字母小写 (仅对内调用,不可被非自己包下调用)

总结

怎么看着结构体就是类,类就是结构体?如果你也有这种疑问那是很正常吧,因为前言说了使用结构体模拟类,实现了类的三大特点。
End

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Golang(又称Go)是一种静态型,编译型,开源的编程语言,它以简洁、高效、并发和可靠著称。学习Golang主要包括以下几个步骤。 1. 学习基本语法:首先,要理解Golang的基本语法,包括变量、函数、数据型、运算符、流程控制等。可以通过在线教程、书籍或官方文档来学习。 2. 熟悉标准库:Golang提供了丰富的标准库,包括各种常用功能,如字符串处理、文件操作、网络编程等。熟悉标准库可以帮助我们更快地编写高效的代码。 3. 学习并发编程:Golang天生支持并发编程,通过goroutine和channel可以实现高效的并发操作。学习并发编程可以帮助解决高并发场景下的问题,提升程序性能。 4. 掌握常用框架和工具:Golang有许多优秀的框架和工具,如Gin、Beego、Echo等。这些框架和工具可以帮助提高开发效率,快速搭建应用。 5. 实践项目:通过实践项目来巩固所学知识,可以选择一些小型的项目开始,逐渐挑战更复杂的项目。通过实践不断提升编程技能和解决问题的能力。 6. 加强算法和数据结构的学习:算法和数据结构是编程的基础,深入学习并理解常见的算法和数据结构是提升编程能力的重要一步。 总结起来,学习Golang的顺序应该是先学习基本语法,然后掌握标准库,学习并发编程,掌握常用框架和工具,实践项目,最后加强算法和数据结构的学习。此外,持续积累编程经验和不断学习新技术也是非常重要的。 ### 回答2: 学习Golang的顺序可以分为四个主要步骤。 1. 学习基本语法和数据型 首先,要学习Golang的基本语法和数据型。了解如何声明变量、使用条件语句、循环和函数等基本概念。掌握Golang的数据型包括整数、浮点数、字符、字符串、数组、切片、映射、结构体等。理解它们的特点和用法学习Golang的基础。 2. 掌握面向对象编程 Golang支持面向对象编程,要学习如何使用结构体和方法定义和组织代码。学习如何创建结构体型和使用方法来处理结构体实例。了解封装、继承和多态的概念,并学会如何在Golang实现它们。 3. 学习并发编程 Golang是为并发编程而生的语言,学习并发编程是使用Golang的重要一步。了解Golang的并发原语,例如goroutine和通道。掌握如何创建和管理goroutine,并学会使用通道进行不同goroutine之间的通信和同步。理解并发编程的基本概念和常见问题,例如竞态条件和死锁,并学习如何解决它们。 4. 深入学习标准库和其它常用包 最后,要深入学习Golang的标准库和其它常用包。Golang拥有丰富的标准库,涵盖了许多领域,包括网络编程、文件处理、数据库操作等。学习如何使用标准库提供的功能来解决实际问题。此外,还可以学习一些常用的第三方库,以扩展Golang的功能和效率。 总结起来,学习Golang的顺序是:基本语法和数据型 -> 面向对象编程 -> 并发编程 -> 标准库和其它常用包。通过有序的学习,可以逐步掌握Golang的核心概念和技术,为实际项目的开发做好准备。 ### 回答3: 学习Golang的顺序可以分为以下几个步骤: 1. 学习基本语法:首先要了解Golang的基本语法规则,包括变量、常量、数据型、函数、控制流等。可以通过阅读官方文档、在线教程或者参考书籍来学习。 2. 理解并发编程:Golang是以并发为核心设计的编程语言,支持轻量级的线程(Goroutine)和通信(Channel)机制。学习并发编程的原理和技巧,包括Goroutine的创建和调度、Channel的使用、互斥锁和条件变量等。 3. 掌握标准库:Golang提供了丰富的标准库,涵盖了文件处理、网络编程、数据解析、加密解密等各个方面。学习并熟悉标准库的使用,可以提高开发效率和代码质量。 4. 学习常用框架和工具:Golang有许多优秀的第三方框架和工具可供使用,如Web开发框架Gin、数据库ORM框架GORM、测试框架Testify等。选择合适的框架和工具,可以提高开发效率和性能。 5. 实践项目:通过实际项目的练习,将所学知识应用到实际,加深理解和巩固技能。可以选择一些简单但实用的项目,逐渐挑战更复杂的需求。 6. 阅读优秀的开源代码:阅读和理解一些优秀的开源项目代码,可以提高自己的编程水平和技术见识。可以选择一些知名的开源项目,如Docker、Kubernetes等。 总之,学习Golang需要循序渐进,从基础语法开始,逐步深入学习并发编程、标准库、框架和工具的使用,同时注重实践项目和阅读开源代码。通过不断学习和练习,可以掌握Golang使用技巧,提升自己的编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姚二龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值