首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
复杂数据类型
值类型和指针类型
值类型和指针类型的存储结构
为什么要区分值类型和指针类型
关于引用类型
slice(切片)的使用及实现原理
切片如何实现大小可变
切片的声明和定义
切片长度的扩展
切片容量的扩展
切片参数的复制
利用数组创建切片
利用切片创建切片
切片元素的修改
切片的循环处理
切片索引越界
总结切片操作的底层原理
map(映射)的使用及实现原理
声明和创建map
遍历map中的元素
元素查找与避免二义性
删除元素
map的存储结构解析
map元素的定位原理解析
map的容量扩展原理解析
channel(通道)的使用及实现原理
channel的使用
channel的实现原理
channel与消息队列、协程通信的对比
自定义结构体
自定义数据类型和自定义结构体
自定义结构体的使用
利用new创建实例
从自定义结构体看访问权限控制
自描述的访问权限
编程范例——结构体使用实例
利用自定义结构体实现bitmap
利用timer.Ticker实现定时任务
流程控制
分支控制
if语句实现分支控制
switch语句实现分支控制
分支控制的本质是向下跳转
避免多层if嵌套的技巧
循环控制
for循环
for-range循环
循环控制的本质是向上跳转
循环和递归的区别
跳转控制
goto关键字的使用
goto的本质是任意跳转
编程范例——流程控制的灵活使用
for循环的误区
switch-case的灵活使用
当前位置:
首页>>
技术小册>>
深入浅出Go语言核心编程(二)
小册名称:深入浅出Go语言核心编程(二)
### 自定义数据类型和自定义结构体 在Go语言的编程世界里,自定义数据类型与结构体(Structs)是构建复杂、可复用且高效代码的基础。它们不仅帮助开发者将相关的数据组织在一起,还通过封装和抽象提高了代码的可读性、可维护性和可扩展性。本章将深入探讨如何在Go语言中定义和使用自定义数据类型以及结构体,包括其基本语法、应用场景、以及高级特性如嵌套结构体、匿名结构体、结构体标签(Tags)等。 #### 一、自定义数据类型 在Go中,自定义数据类型允许开发者基于内置类型(如int、float64、string等)或已存在的类型创建新的类型。这种类型定义不会引入新的数据结构,但它为类型增加了语义上的含义,有助于编写更清晰、更易于理解的代码。 ##### 1.1 类型别名 类型别名是Go 1.9版本引入的一个特性,它允许你为现有的类型创建一个新的名字,而不需要定义一个新的类型。类型别名使用`type`关键字后跟新名字和`=`以及原类型名来定义。 ```go type MyInt int type MyString string func main() { var a MyInt = 5 var b MyString = "Hello, Go!" fmt.Println(a, b) // 输出: 5 Hello, Go! } ``` 虽然`MyInt`和`int`、`MyString`和`string`在底层表示上是相同的,但它们被视为不同的类型。这意味着你不能直接将`int`类型的值赋给`MyInt`类型的变量,反之亦然,除非进行显式类型转换。 ##### 1.2 自定义类型与接口 自定义类型对于接口实现特别有用。在Go中,接口是一种类型,它定义了一组方法,但不实现它们。具体的类型(包括自定义类型)只要实现了这些方法,就实现了该接口,而无需显式声明“我实现了这个接口”。 ```go type Shape interface { Area() float64 } type Circle struct { radius float64 } // Circle 实现了 Shape 接口的 Area 方法 func (c Circle) Area() float64 { return math.Pi * c.radius * c.radius } func main() { var s Shape = Circle{radius: 5} fmt.Println(s.Area()) // 输出圆的面积 } ``` #### 二、自定义结构体 结构体是Go语言中一种复合数据类型,它允许你将多个不同类型的值组合成一个单一的类型。结构体通过`struct`关键字定义,并在花括号`{}`中列出其字段(也称为成员变量)。 ##### 2.1 定义结构体 定义一个结构体非常简单,只需指定结构体的名称和字段即可。 ```go type Person struct { Name string Age int Email string Address Address // 假设Address是另一个结构体类型 } type Address struct { Street string City string Country string } ``` ##### 2.2 初始化结构体 结构体可以通过多种方式初始化: - 使用字面量(也称为复合字面量): ```go p := Person{ Name: "John Doe", Age: 30, Email: "john.doe@example.com", Address: Address{Street: "123 Elm St", City: "Somewhere", Country: "USA"}, } ``` - 使用字段名(字段顺序不重要): ```go p := Person{ Name: "Jane Doe", Email: "jane.doe@example.com", Age: 28, Address: Address{City: "Elsewhere", Street: "456 Oak Ave", Country: "Canada"}, } ``` - 使用`new`关键字(注意,这仅分配了内存,未初始化字段): ```go p := new(Person) p.Name = "Alice" p.Age = 25 // 以此类推,初始化其他字段 ``` ##### 2.3 结构体指针 在Go中,经常以指针的形式传递结构体,特别是当结构体较大或需要在多个函数间共享数据时。通过传递结构体的指针,可以避免复制整个结构体,从而提高效率。 ```go func modifyPerson(p *Person) { p.Age = 31 } func main() { p := Person{Name: "Bob", Age: 30} modifyPerson(&p) fmt.Println(p.Age) // 输出: 31 } ``` ##### 2.4 嵌套结构体 在Go中,结构体可以嵌套,即一个结构体的字段可以是另一个结构体类型。这有助于组织复杂的数据结构,并减少重复的代码。 ```go type User struct { ID int Username string Details UserDetails } type UserDetails struct { PhoneNumber string Address Address } // 使用嵌套结构体的示例 var user = User{ ID: 1, Username: "user123", Details: UserDetails{ PhoneNumber: "123-456-7890", Address: Address{Street: "789 Pine St", City: "Hometown", Country: "XYZ"}, }, } ``` ##### 2.5 匿名结构体 在某些情况下,你可能需要临时定义一个结构体,而不想为其命名。这时,可以使用匿名结构体。 ```go var point = struct { X, Y int }{ X: 10, Y: 20, } fmt.Println(point.X, point.Y) // 输出: 10 20 ``` ##### 2.6 结构体标签(Struct Tags) 结构体标签是Go语言的一个非常有用的特性,它允许你在结构体字段后面附加元数据信息。这些标签以字符串的形式存在,通常用于序列化、反序列化、JSON处理、数据库ORM映射等场景。 ```go type Product struct { ID string `json:"id"` Name string `json:"name"` Price float64 `json:"price,omitempty"` // 如果Price为0,则在JSON中忽略此字段 } ``` 在上面的例子中,`json:"id"`、`json:"name"`和`json:"price,omitempty"`就是结构体标签,它们告诉JSON编解码器如何处理`Product`结构体的字段。 #### 三、总结 自定义数据类型和结构体是Go语言中非常重要的概念,它们为开发者提供了强大的工具来组织和管理数据。通过自定义数据类型,我们可以为内置类型添加语义,使代码更清晰、更易于维护。而结构体则允许我们创建复合类型,将多个字段组织在一起,并通过嵌套、指针、结构体标签等特性,实现更复杂、更灵活的数据结构。掌握这些概念,对于编写高质量的Go语言代码至关重要。
上一篇:
自定义结构体
下一篇:
自定义结构体的使用
该分类下的相关小册推荐:
深入浅出Go语言核心编程(五)
GO面试指南
go编程权威指南(二)
从零写一个基于go语言的Web框架
深入浅出Go语言核心编程(七)
Go开发权威指南(上)
深入浅出Go语言核心编程(一)
Go开发基础入门
Go 组件设计与实现
Go语言从入门到实战
Golang并发编程实战
深入浅出Go语言核心编程(四)