Golang入门教程(八)复合数据类型使用案例一
目录
- 数组
- 指针
- 结构体(struct)
一、数组
Go 语言提供了数组类型的数据结构。
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。
相对于去声明number0, number1, ..., and number99的变量,使用数组形式numbers[0], numbers[1] ..., numbers[99]更加方便且易于扩展。
数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推。
代码 basic_array.go
1 2 3 4 5 6 7 8 9 10 11 | package main import "fmt" func main() { var intArr = [6]int{1, 2, 3, 4, 5, 6} fmt.Println( "intarr1 = " , intArr) var strArr = []string{ "this" , "is" , "a" , "数组类型" , "test" } fmt.Println( "strarr1 = " , strArr) } |
执行结果
二、指针
Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。
接下来让我们来一步步学习 Go 语言指针。
我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址。
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
代码1
1 2 3 4 5 6 7 8 9 | package main import "fmt" func main() { var a int = 10 fmt.Printf( "变量的地址: %x\n" , &a ) } |
执行结果
现在我们已经了解了什么是内存地址和如何去访问它。接下来我们将具体介绍指针。
(1)什么是指针?
一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。
类似于变量和常量,在使用指针前你需要声明指针。指针声明格式如下:
1 | var var_name * var -type |
var-type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针。以下是有效的指针声明:
1 2 | var ip *int /* 指向整型*/ var fp *float32 /* 指向浮点型 */ |
本例中这是一个指向 int 和 float32 的指针。
(2)如何使用指针
指针使用流程:
- 定义指针变量。
- 为指针变量赋值。
- 访问指针变量中指向地址的值。
在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package main import "fmt" func main() { var a int = 20 /* 声明实际变量 */ var ip *int /* 声明指针变量 */ ip = &a /* 指针变量的存储地址 */ fmt.Printf( "a 变量的地址是: %x\n" , &a) /* 指针变量的存储地址 */ fmt.Printf( "ip 变量储存的指针地址: %x\n" , ip) /* 使用指针访问值 */ fmt.Printf( "*ip 变量的值: %d\n" , *ip) } |
执行结果
(3)Go 空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
一个指针变量通常缩写为 ptr。
查看以下实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package main import "fmt" func main() { var ptr *int fmt.Printf( "ptr 的值为 : %x\n" , ptr ) // 空指针判断 if ptr != nil { fmt.Printf( "ptr 不是空指针" ) } if ptr == nil { fmt.Printf( "ptr 是空指针" ) } } |
执行结果
(4)空指针判断
1 2 | if (ptr != nil) /* ptr 不是空指针 */ if (ptr == nil) /* ptr 是空指针 */ |
三、结构体
Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性:
- Title :标题
- Author : 作者
- Subject:学科
- ID:书籍ID
(1)定义结构体
结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体有中有一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下:
1 2 3 4 5 6 | type struct_variable_type struct { member definition; member definition; ... member definition; } |
一旦定义了结构体类型,它就能用于变量的声明,语法格式如下:
1 | variable_name := structure_variable_type {value1, value2...valuen} |
(2)访问结构体成员
如果要访问结构体成员,需要使用点号 (.) 操作符,格式为:"结构体.成员名"。
结构体类型变量使用struct关键字定义,实例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package main import "fmt" type Books struct { title string author string subject string book_id int } func main() { var Book1 Books /* 声明 Book1 为 Books 类型 */ var Book2 Books /* 声明 Book2 为 Books 类型 */ /* book 1 描述 */ Book1.title = "Go 语言" Book1.author = "www.runoob.com" Book1.subject = "Go 语言教程" Book1.book_id = 6495407 /* book 2 描述 */ Book2.title = "Python 教程" Book2.author = "www.runoob.com" Book2.subject = "Python 语言教程" Book2.book_id = 6495700 /* 打印 Book1 信息 */ fmt.Printf( "Book 1 title : %s\n" , Book1.title) fmt.Printf( "Book 1 author : %s\n" , Book1.author) fmt.Printf( "Book 1 subject : %s\n" , Book1.subject) fmt.Printf( "Book 1 book_id : %d\n" , Book1.book_id) /* 打印 Book2 信息 */ fmt.Printf( "Book 2 title : %s\n" , Book2.title) fmt.Printf( "Book 2 author : %s\n" , Book2.author) fmt.Printf( "Book 2 subject : %s\n" , Book2.subject) fmt.Printf( "Book 2 book_id : %d\n" , Book2.book_id) } |
执行结果
代码2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package main import "fmt" type Persons struct { name string age int blog string ID int } func main() { var Tinywan Persons /* 声明 Tinywan 为 Persons 类型 */ /* Tinywan 个人信息描述 */ Tinywan.name = "ShaoBo Wan" Tinywan.age = 24 Tinywan.blog = "www.tinywan.com" Tinywan.ID = 756684177 /* 打印 Book1 信息 */ fmt.Printf( "Tinywan name : %s\n" , Tinywan.name) fmt.Printf( "Tinywan age : %d\n" , Tinywan.age) fmt.Printf( "Tinywan blog : %s\n" , Tinywan.blog) fmt.Printf( "Tinywan ID : %d\n" , Tinywan.ID) } |
执行结果
(3)结构体作为函数参数
你可以像其他数据类型一样将结构体类型作为参数传递给函数。并以以上实例的方式访问结构体变量
package main import "fmt" type Books struct { title string author string subject string book_id int } func main() { var Book1 Books /* 声明 Book1 为 Books 类型 */ var Book2 Books /* 声明 Book2 为 Books 类型 */ /* book 1 描述 */ Book1.title = "Go 语言" Book1.author = "www.runoob.com" Book1.subject = "Go 语言教程" Book1.book_id = 6495407 /* book 2 描述 */ Book2.title = "Python 教程" Book2.author = "www.runoob.com" Book2.subject = "Python 语言教程" Book2.book_id = 6495700 /* 打印 Book1 信息 */ printBook(Book1) /* 打印 Book2 信息 */ printBook(Book2) } func printBook(book Books) { fmt.Printf("Book title : %s\n", book.title) fmt.Printf("Book author : %s\n", book.author) fmt.Printf("Book subject : %s\n", book.subject) fmt.Printf("Book book_id : %d\n", book.book_id) }
执行结果
更多demo :http://www.runoob.com/go/go-structures.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构