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

简介: 结构体是由一系列相同或不相同类型数据组成的数据集合

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

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

结构体定义格式如下:

type 类型名 struct{
  字段1 类型1
  字段2 类型2
  //...
}
复制代码

结构体初始化

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() 函数进行结构体的排序

示例:

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)
}
复制代码

运行结果:

[{test2 aa} {test1 bb} {test3 cc}]
[{test1 bb} {test2 aa} {test3 cc}]
复制代码

结构体继承

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

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

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...
}
复制代码

改写父类的方法

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()
}
复制代码

运行结果:

father...
child start...
father...
child end...
复制代码

匿名结构体

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

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"

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

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 中的多态是通过接口实现的:

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)
}
复制代码

打印结果:

Student...
Teacher...


相关文章
|
3月前
|
缓存 弹性计算 API
用 Go 快速开发一个 RESTful API 服务
用 Go 快速开发一个 RESTful API 服务
|
17天前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
20天前
|
Go 数据安全/隐私保护 开发者
Go语言开发
【10月更文挑战第26天】Go语言开发
33 3
|
21天前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
28 3
|
2月前
|
Go
Go to Learn Go之结构体
Go to Learn Go之结构体
37 5
|
2月前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
3月前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
133 1
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
2月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
3月前
|
JSON 缓存 监控
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境