前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang结构体初探

Golang结构体初探

作者头像
PayneWu
发布于 2020-12-18 02:01:23
发布于 2020-12-18 02:01:23
59400
代码可运行
举报
文章被收录于专栏:积跬Coder积跬Coder
运行总次数:0
代码可运行

结构体

Go语言中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型明显就无法满足需求了,Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称struct。也就是我们可以通过struct来定义自己的类型了。

Go语言中通过struct来实现面向对象的相关概念。

结构体的定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 使用type和struct关键字来定义结构体
type 类型名 struct {
    字段名 字段类型
    字段名 字段类型
    …
}

结构体定义需注意

  • 类型名:标识自定义结构体的名称,在同一个包内不能重复。
  • 字段名:表示结构体字段名。结构体中的字段名必须唯一。
  • 字段类型:表示结构体字段的具体类型

具体定义如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Person struct {
	name string
	age int
	male string
}


// 当有相同类型的时候,我们还可以将相同类型的变量名使用“,”分割,写在一起。如下
type Person1 struct {
	name,male string
	age int
}

这样我们就拥有了一个的自定义类型person,它有namemaleage三个字段,分别表示姓名、性别和年龄。这样我们使用这个person结构体就能够很方便的在程序中表示和存储人信息了。

语言内置的基础数据类型是用来描述一个值的,而结构体是用来描述一组值的。比如一个人有名字、年龄和性别等,本质上是一种聚合型的数据类型

将前面的融汇贯通,整点复合型的东东,搞起

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type MyString string
type MyInt=int

type Person struct {
	name MyString
	age MyInt
	male string
}

结构体定义了之后,咱们还需要进行初始化,才能使用。

结构体初始化与基本使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

type MyString string
type MyInt = int

type Person struct {
	name MyString
	age  MyInt
	sex  string
}

type Person1 struct {
	name, sex string
	age       int
}

func main() {
	var p Person
	var p1 Person1
	p.name = "Payne"
	p.sex = "male"
	p.age = 20

	p1.name = "Tim"
	p1.sex = "female"
	p1.age = 23
	fmt.Printf("Type:%T,value:%v\n", p, p)
	fmt.Printf("%#v\n", p)
	fmt.Printf("Type:%T,value:%v\n", p1, p1)
	fmt.Printf("%#v", p1)
}

Type:main.Person,value:{Payne 20 male} main.Person{name:“Payne”, age:20, sex:“male”} Type:main.Person1,value:{Tim female 23} main.Person1{name:“Tim”, sex:“female”, age:23}

通过以上示例我们知道,它是通过.,来一个一个的进行赋值

当然我们也是可以通过键值对对形式,从而进行批量赋值的,如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	p1 := Person1{
		name: "a",
		age:  20,
		sex:  "male",
	}
	fmt.Printf("type: %T, value:%#v", p1, p1)
匿名结构体

在定义一些临时数据结构等场景下还可以使用匿名结构体。如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {
	var person2 struct {
		name string
		age  int
		sex  string
	}
	person2.name = "Payne"
	person2.age = 20
	person2.sex = "male"
	fmt.Printf("Type:%T,value:%v\n", person2, person2)
	fmt.Printf("%#v\n", person2)
}

// Type:struct { name string; age int; sex string },value:{Payne 20 male}
// struct { name string; age int; sex string }{name:"Payne", age:20, sex:"male"}

指针类型结构体

通过使用new关键字堆结构体初始化,得到的是结构体的地址值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

type person3 struct {
	name   string
	gender string
	hobby  string
	age    int
}

func main() {
	var p3 = new(person3)
	fmt.Printf("Type:%T, Vlue:%v", p3, p3)
}

既然是地址值,那么我们也是可以使用&对他进行运算等操作的,相当于new

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

type person3 struct {
	name   string
	gender string
	hobby  []string
	age    int
}

func main() {
	p3 := &person3{}
	p3.name = "payne"
	p3.gender = "sex"
	p3.hobby = []string{"a", "b"}
	p3.age = 20
	
}

p3.name = "payne"其实在底层是(*p3).name = "payne",这是Go语言帮我们实现的语法糖。

构造函数

Go语言的结构体没有构造函数,我们可以自己实现。例如,下方的代码就实现了一个person的构造函数。因为struct是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型

借用结构体构造函数,实现的概念,如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

type person5 struct {
	name string
	age  int
}

func newClass(name string, age int) *person5 {
	return &person5{
		name: name,
		age:  age,
	}
}

func main() {
	p5 := newClass("payne", 10)
	fmt.Printf("value:%#v", p5)
}

Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者 self

方法的定义格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
    函数体
}

func (谁能调用我?-接收者) 方法名(参数列表) (返回类型) {
  函数体
}

其中,

  • 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名称首字母的小写,而不是selfthis之类的命名。例如,Person类型的接收者变量应该命名为 pConnector类型的接收者变量应该命名为c等。
  • 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
  • 方法名、参数列表、返回参数:具体格式与函数定义相同。

举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Person 结构体
type Person struct {
	name string
	age  int8
}

//NewPerson 构造函数
func NewPerson(name string, age int8) *Person {
	return &Person{
		name: name,
		age:  age,
	}
}

//Dream Person做梦的方法
func (p Person) Dream() {
	fmt.Printf("%s的梦想是学好Go语言!\n", p.name)
}

func main() {
	p1 := NewPerson("Payne", 25)
	p1.Dream()
}

方法与函数的区别是,函数不属于任何类型,方法属于特定的类型。

值类型的接收者

当方法作用于值类型接收者时,Go语言会在代码运行时将接收者的值复制一份。在值类型接收者的方法中可以获取接收者的成员值,但修改操作只是针对副本,无法修改接收者变量本身。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// SetAge2 设置p的年龄
// 使用值接收者
func (p Person) SetAge2(newAge int8) {
	p.age = newAge
}

func main() {
	p1 := NewPerson("Payne", 25)
	p1.Dream()
	fmt.Println(p1.age) // 25
	p1.SetAge2(30) // (*p1).SetAge2(30)
	fmt.Println(p1.age) // 25
}

指针类型的接收者

指针类型的接收者由一个结构体的指针组成,由于指针的特性,调用方法时修改接收者指针的任意成员变量,在方法结束后,修改都是有效的。这种方式就十分接近于其他语言中面向对象中的this或者self。例如我们为Person添加一个SetAge方法,来修改实例变量的年龄。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// SetAge 设置p的年龄
// 使用指针接收者
func (p *Person) SetAge(newAge int8) {
	p.age = newAge
}

调用该方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
	p1 := NewPerson("Payne", 25)
	fmt.Println(p1.age) // 25
	p1.SetAge(30)
	fmt.Println(p1.age) // 30
}

什么时候应该使用指针类型接收者

  1. 需要修改接收者中的值
  2. 接收者是拷贝代价比较大的大对象
  3. 保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者。

结构体的“继承”

Go语言中使用结构体也可以实现其他编程语言中面向对象的继承。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Animal 动物
type Animal struct {
	name string
}

func (a *Animal) move() {
	fmt.Printf("%s会动!\n", a.name)
}

//Dog 狗
type Dog struct {
	Feet    int8
	*Animal //通过嵌套匿名结构体实现继承
}

func (d *Dog) wang() {
	fmt.Printf("%s会汪汪汪~\n", d.name)
}

func main() {
	d1 := &Dog{
		Feet: 4,
		Animal: &Animal{ //注意嵌套的是结构体指针
			name: "aw",
		},
	}
	d1.wang() //aw会汪汪汪~
	d1.move() //aw会动!
}

注意点:

  1. Golang传递参数,永远是拷贝。也就是说,在函数内部改变其值,仅仅在内部生效。若想在某一函数中改变其全局的值。需要使用指针
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 积跬Coder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
go-结构体
Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。
新人小试
2020/03/09
6220
5.Go编程快速入门学习
描述: Go语言中目前(1.16 版本中)是没有异常处理机制(Tips :说是在2.x版本中将会加入异常处理机制),但我们可以使用error接口定义以及panic/recover函数来进行异常错误处理。
全栈工程师修炼指南
2022/09/29
7680
5.Go编程快速入门学习
Golang之旅15-方法和接收者
方法Method是种作用域特殊类型变量的函数,特定类型的变量称为接收者receiver。接收者类似Python中的self。方法的定义格式
皮大大
2021/03/02
4510
Golang数据类型之结构体-上篇
1、结构体介绍 2、结构体的定义 3、构造结构体实例 4、声明与初始化 5、属性的访问和修改 1、结构体介绍 为什么要有结构体? 数组只能保存同一种类型的数据,当需要记录多种不同类型的数据,并
仙人技术
2021/08/31
8900
Golang数据类型之结构体-上篇
Go语言中的结构体和方法
在Go语言中,可以使用struct关键字定义结构体。结构体定义了一个包含多个字段的数据类型,每个字段都有一个名称和类型。
数字扫地僧
2024/06/16
1480
go语言第六章(结构体与方法)
在 Go 语言中,结构体(struct)是一种自定义的数据类型,由一组具有不同类型的字段组成。而方法(method)则是一类特殊的函数,它与某个类型绑定,并可以访问和修改该类型的字段和属性。
GeekLiHua
2025/01/21
770
go语言第六章(结构体与方法)
Golang之旅16-嵌套结构体
内容 嵌套结构体 不同的结构体之间的命名冲突 结构体的继承实现 嵌套结构体 一个结构体中可以嵌套包含另一个结构体或结构体指针 package main import "fmt" type Address struct { Provice string //字段名称 字段类型 City string } type User struct { Name string Gender string Address Address //类型是上面的Address类型 } // 结构体的
皮大大
2021/03/02
8460
Golang结构体入门
1.结构体是值类型:在Go语言中,结构体是一种值类型,与数组和基本数据类型一样。当结构体被赋值给一个变量或传递给一个函数时,它的值会被复制一份。因此,对复制的结构体进行修改不会影响原来的结构体。
周小末天天开心
2023/10/16
1860
【Golang】快速复习指南QuickReview(六)——struct
实际编程时,经常需要用相关的不同类型的数据来描述一个数据对象。C#中有类(Class),结构(Struct),当然类就不介绍了。Golang中叫结构体(C,C++好像还是结构体),但是单词还是Struct,无论是在Golang还是C#, struct都是一个值类型。
DDGarfield
2022/06/23
5750
Golang面向对象中易混淆的几个概念
篇外话:从事云计算后端项目非前端开发,若时间有限,值得深入接触的编程语言有4门:c/java/go/rust,若有余力,每个语言都可以深入接触。至于Python语言,可以利用其在配置脚本领域的优势,和bash,perl一样当配置脚本语言,工具语言使用,Python不太适合大型的后端项目开发。
后端云
2022/11/25
4150
Golang之旅19_接口interface
下面的栗子中dog、cat 、person都实现了say()方法,因此在接口sayer中只要是实现了say()方法的都可以使用。
皮大大
2021/03/02
4690
Golang方法接收者
func(receiver receiver_type)some_func_name(arguments)return_values
有态度的马甲
2022/08/23
1K0
从零开发区块链应用(八)--结构体初识
Go 语言中提供了对 struct 的支持,struct,中文翻译称为结构体,与数组一样,属于复合类型,并非引用类型。Go 语言的 struct,与 C 语言中的 struct 或其他面向对象编程语言中的类(class)类似,可以定义字段(属性)和方法,但也有很不同的地方,需要深入学习,才能区分他们之间的区别。
Tiny熊
2022/02/22
7110
Go 结构体
如上示例,type关键字定义了一个animal类型,animal类型后面的struct表明这是一个结构体,它有name、age、class、weight四个字段,每个字段后面定义了其对应的类型。
一行舟
2022/08/25
1K0
Go基础之--结构体和方法
结构体的定义 结构体是将零个或者多个任意类型的命令变量组合在一起的聚合数据类型。 每个变量都叫做结构体的成员。 其实简单理解,Go语言的结构体struct和其他语言的类class有相等的地位,但是GO语言放弃了包括继承在内的大量面向对象的特性,只保留了组合这个基础的特性。 所有的Go语言类型除了指针类型外,都可以有自己的方法。 先通过一个下的例子理解struct,下面的这个例子用于定义一个student的struct,这个机构体有以下属性:Name,Age,Sex,Score,分别表示这个学生的名字,年龄,
coders
2018/03/30
6980
Go基础之--结构体和方法
GO语言入门教程
Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。
终身幼稚园
2020/05/18
1K0
GO语言入门教程
Golang之旅14-struct2
通过new关键字进行结构体的实例化,得到是结构体的地址。指向结构体指针的类似于其他指针变量,格式
皮大大
2021/03/02
2240
【初识Go】| Day8 结构体、方法、接口
结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。Go 语言中没有“类”的概念,也不支持像继承这种面向对象的概念。但是Go 语言的结构体与“类”都是复合结构体,而且Go 语言中结构体的组合方式比面向对象具有更高的扩展性和灵活性。比如用结构体的经典案例处理公司的员工信息,每个员工信息包含一个唯一的员工编号、员工的名字、家庭住址、出生日期、工作岗位、薪资、上级领导等等。所有的这些信息都需要绑定到一个实体中,可以作为一个整体单元被复制,作为函数的参数或返回值,或者是被存储到数组中,等等。
yussuy
2020/12/23
5540
【初识Go】| Day8 结构体、方法、接口
go结构体
类型别名与类型定义表面上看只有一个等号的差异,我们通过下面的这段代码来理解它们之间的区别。
Michel_Rolle
2023/11/11
2.7K0
Golang之旅13-struct1
Go中的基本数据类型有string、整型、浮点型、布尔型等,类型可以自定义,通过type关键字实现:
皮大大
2021/03/02
3060
相关推荐
go-结构体
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验