Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go 开发常用操作技巧--结构体

Go 开发常用操作技巧--结构体

作者头像
微客鸟窝
发布于 2023-01-09 11:19:31
发布于 2023-01-09 11:19:31
29500
代码可运行
举报
文章被收录于专栏:Go语言指北Go语言指北
运行总次数:0
代码可运行

结构体是由一系列相同或不相同类型数据组成的数据集合。 结构体的成员(字段)的特性:

  • 字段名必须唯一
  • 字段有自己的类型和值
  • 字段的类型也可以是结构体,甚至是字段所在结构体的类型

结构体定义格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type 类型名 struct{
  字段1 类型1
  字段2 类型2
  //...
}

结构体初始化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Mystruct struct {
 Name    string
 Address string
}

//方法一
var person Mystruct
person.Name = "test"
person.Address = "beijing"

//方法二
person1 := Mystruct{"test","beijing"}

//方法三
//(*person2).Name 等同于 person2.Name
var person2 = new(Mystruct)
person2.Name = "test"
person2.Address = "beijing"

//方法四
//(*Mystruct).Name 等同于 person3.Name
var person3 = &Mystruct{}
(*person3).Name = "test"
(*person3).Address = "beijing"

结构体排序

可以通过 sort.Slice() 函数进行结构体的排序

示例:

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

import (
 "fmt"
 "sort"
)

type Mystruct struct {
 Name    string
 Address string
}

func main() {
 persons := []Mystruct{
  {"test2", "aa"},
  {"test1", "bb"},
  {"test3", "cc"},
 }
 fmt.Println(persons)
 sort.Slice(persons, func(i, j int) bool {
  return persons[i].Name < persons[j].Name || persons[i].Address < persons[j].Address
 })
 fmt.Println(persons)
}

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[{test2 aa} {test1 bb} {test3 cc}]
[{test1 bb} {test2 aa} {test3 cc}]

结构体继承

Go 语言中没有 extends 关键字,不能像其他语言那样去实现类的继承。在Go中,使用的是 interface 实现的功能组合,以组合的形式来实现继承。

如下我们创建一个父类结构体 Father,再用子类 Child 继承父类,实现在 Child 中调用父类的方法,示例:

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

import (
 "fmt"
)

type Father struct {
 Name string
}
func (f Father) Say(){
 fmt.Println("father...")
}

type Child struct {
 Father
}

func main() {
 child := Child{}
 child.Father.Say() // father...
 //直接使用下面的写法也可以,Go语言做了相关的优化,直接调用方法也可以找到父类中的方法
 child.Say() // father...
}

改写父类的方法

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

import (
 "fmt"
)

type Father struct {
 Name string
}
func (f Father) Say(){
 fmt.Println("father...")
}

type Child struct {
 Father
}

func (c Child)Say(){
 fmt.Println("child start...")
 c.Father.Say()
 fmt.Println("child end...")
}

func main() {
 child := Child{}
 child.Father.Say()
 //被 child 改写后,下面调用的就是自身的方法
 child.Say()
}

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
father...
child start...
father...
child end...

匿名结构体

顾名思义,匿名结构体就是没有名字的结构体,示例如下:

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

import "fmt"

func main() {
 book := struct {   // 无需事先声明
  title  string
  id     int
 }{
  title:  "Go语言",  // 定义完成之后,即可进行初始化  
  id:     123456,
 }
 fmt.Println("title ", book.title)
 fmt.Println("id", book.id)
}

// 打印结果
// title  Go语言
// id 123456

结构体字段标签

结构体字段标签(tag)是结构体额外的信息,用于对字段进行说明。在 json 序列化及对象关系映射时,会用到此标签。标签信息都是静态的,无需实例化结构体,可以通过反射来获得。

标签在结构体后面,由一个或多个键值组成,键值间使用空格分隔: key1:"value1" key2:"value2"

使用反射获取结构体标签信息:

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

import (
 "fmt"
 "reflect"
)

type Test struct {
 Name string `json:"name"`
}

func main() {
 var test = Test{}
 //反射获取标签信息
 typeTest := reflect.TypeOf(test)
 testFieldName, ok := typeTest.FieldByName("Name")
 if ok {
  fmt.Println(testFieldName.Tag.Get("json"))
 }
}

// 打印结果
// name

多态

  • 继承主要在于: 解决代码的复用性和可维护性;
  • 接口主要在于: 接口设计好各种规范方法,让其它自定义类型实现这些方法;
  • 接口比继承更加灵活,继承是满足is-a的关系,接口是满足like-a的关系;

Go 中的多态是通过接口实现的:

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

import "fmt"

type People interface {
 Say()
}
type Student struct {}
type Teacher struct {}

func (p *Student) Say(){
 fmt.Println("Student...")
}

func (c *Teacher) Say(){
 fmt.Println("Teacher...")
}

func hello(p People) {
 p.Say()
}
func main(){
 var student = new(Student)
 var teacher = new(Teacher)
 hello(student)
 hello(teacher)
}

打印结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Student...
Teacher...

图片及部分相关技术知识点来源于网络搜索,侵权删!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微客鸟窝 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go语言中的结构体和方法
在Go语言中,可以使用struct关键字定义结构体。结构体定义了一个包含多个字段的数据类型,每个字段都有一个名称和类型。
数字扫地僧
2024/06/16
1580
Golang结构体入门
1.结构体是值类型:在Go语言中,结构体是一种值类型,与数组和基本数据类型一样。当结构体被赋值给一个变量或传递给一个函数时,它的值会被复制一份。因此,对复制的结构体进行修改不会影响原来的结构体。
周小末天天开心
2023/10/16
1890
Go 开发常用操作技巧--map
map 是一种特殊的数据类型,它是一种元素对的「无序」集合,元素对为 键(key)值(value) 形式。我们可以通过 key 来快速找到与之对应的 value。
微客鸟窝
2023/01/09
2250
go-结构体
Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。
新人小试
2020/03/09
6270
010.golang 结构struct
结构struct Go 中的struct与C中的struct非常相似,并且Go没有class 使用 type <Name> struct{} 定义结构,名称遵循可见性规则 支持指向自身的指针类型成员 支持匿名结构,可用作成员或定义成员变量 匿名结构也可以用于map的值 可以使用字面值对结构进行初始化 允许直接通过指针来读写结构成员 相同类型的成员可进行直接拷贝赋值 支持 == 与 !=比较运算符,但不支持 > 或 < 支持匿名字段,本质上是定义了以某个类型名为名称的字段 嵌入结构作为匿名字段看起来像继承,但
qubianzhong
2018/08/15
3580
Go结构体&接口&反射
Golang中通过type关键词定义一个结构体,需要注意的是,数组和结构体都是值类型
用户9645905
2023/10/28
5230
Go结构体&接口&反射
Golang结构体初探
Go语言中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型明显就无法满足需求了,Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称struct。也就是我们可以通过struct来定义自己的类型了。
PayneWu
2020/12/18
6020
Golang面向对象中易混淆的几个概念
篇外话:从事云计算后端项目非前端开发,若时间有限,值得深入接触的编程语言有4门:c/java/go/rust,若有余力,每个语言都可以深入接触。至于Python语言,可以利用其在配置脚本领域的优势,和bash,perl一样当配置脚本语言,工具语言使用,Python不太适合大型的后端项目开发。
后端云
2022/11/25
4190
Golang学习笔记之结构体(struct)
•通俗来说是⼀个与成员类型同名 (不含包名) 的字段。 •被匿名嵌⼊的可以是任何类型,包括指针。 •不能同时嵌⼊某⼀类型和其指针类型,因为它们名字相同。 •匿名字段可以字段提升。可以像普通字段那样访问匿名字段成员,编译器从外向内逐级查找所有层次的匿名字段,直到发现目标或出错。但结构体匿名字段外层同名字段会遮蔽嵌⼊字段成员
李海彬
2018/12/26
6140
浅谈Go语言中的结构体struct &amp; 接口Interface &amp; 反射
结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套;
李海彬
2018/07/26
1.1K0
浅谈Go语言中的结构体struct &amp; 接口Interface &amp; 反射
结构体
该程序定义了 emp4,却没有初始化任何值。因此 firstName 和 lastName 赋值为 string 的零值("")。而 age 和 salary 赋值为 int 的零值(0)
酷走天涯
2019/06/11
1.2K0
Java的类与Golang的结构体的区别
Java作为一门面向对象(OOP)的编程语言,它有类(class)的存在,而对于Golang,它不完全遵从OOP编程语言的设计思想,但它也有类似Java类的结构存在,那就是结构体(struct)。
程序新视界
2023/11/13
2440
Java的类与Golang的结构体的区别
你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06
    再续前文,在面向对象层面,Python做到了超神:万物皆为对象,而Ruby,则干脆就是神:飞花摘叶皆可对象。二者都提供对象类操作以及继承的方式为面向对象张目,但Go lang显然有一些特立独行,因为它没有传统的类,也没有继承,取而代之的是结构和组合的方式,也就是结构体(struct)的方式来组织代码,达到类似类的效果。
用户9127725
2022/09/21
2780
100天精通Golang(基础入门篇)——第18天:深入解析Go语言中的结构体
在第18天的学习中,我们将深入探索Go语言中的结构体,这是Go语言中一个非常核心的概念。结构体为我们提供了一种封装多个不同类型数据的方法,是构建复杂数据类型的基础。
猫头虎
2024/04/09
1510
100天精通Golang(基础入门篇)——第18天:深入解析Go语言中的结构体
golang 基础编程
map 是一种无序的键值对, 它是数据结构 hash 表的一种实现方式,类似 Python 中的字典
全栈程序员站长
2022/07/19
1.3K0
golang 基础编程
22.Go面向对象-接口
以上实现非常简单,但是有个问题,在main()函数中,当我们想使用减法操作时,创建减法类的对象,调用其对应的减法的方法。
Devops海洋的渔夫
2022/01/17
3050
22.Go面向对象-接口
Golang数据类型之结构体-下篇
c1、c2、c3都是car struct的实例,c2, c3是指向实例的指针,指针中保存的是实例的地址,所以指针再指向实例,c1则是直接指向实例。这三个变量与Car struct实例的指向关系如下
仙人技术
2021/08/31
9120
Golang数据类型之结构体-下篇
golang之Struct什么是结构体struct?
最近在复习golang,学习的东西,如果不使用,很快就会忘记。所以,准备复习完golang,做一个练手的小项目,加深对golang的学习。今天开始公司,进入封闭式开发,所以每天晚上回来,学习golan
若与
2018/04/25
1.7K0
golang之Struct什么是结构体struct?
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
8560
【Golang语言社区】Golang语言面试题
最近在很多地方看到了golang的面试题,看到了很多人对Golang的面试题心存恐惧,也是为了复习基础,我把解题的过程总结下来。
李海彬
2018/03/07
4K2
【Golang语言社区】Golang语言面试题
相关推荐
Go语言中的结构体和方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验