Go 语言编程 — 高级数据类型 — 结构体

目录

结构体

Golang 中,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。与 C 语言中的结构体类似,区别在于 Golang 结构体的操作更加精简,方式更加单一。同时,Golang 中结构体变量也类似于 OOP 中对象的概念,可以具有对象的成员属性和成员方法。

结构体的定义使用了 type 和 struct 关键字。

  • type 关键字:设定了结构体的名称,表示定义一个新的类型(Type)。
  • struct 关键字:表示定义一个新的结构体数据类型,结构体中有一个或多个成员。

结构体的格式如下:

type struct_variable_type struct {
    member definition
    ...
}

一旦定义了结构体类型,就能用作变量声明的类型标识符,与声明基础数据类型的变量无异。格式:

variable_name := structure_variable_type {value1, value2, ..., valueN}
// or
variable_name := structure_variable_type { key1: value1, key2: value2, ..., keyn: valuen}

示例:

package main

import "fmt"

type book_s struct {
    title   string
    author  string
    subject string
    book_id int
}

func main() {
    /* 全值形式定义结构体。 */
    book1 := book_s {"Go 语言", "fanguiju", "Go 语言编程", 1}
    fmt.Println(book1)

	/* key/value 形式定义结构体。 */
    book2 := book_s {title: "Go 语言", author: "fanguiju", subject: "Go 语言编程", book_id: 1}
    fmt.Println(book2)

	/* 缺省形式定义结构体。 */
    book3 := book_s {title: "Go 语言", author: "fanguiju"}
    fmt.Println(book3)
}

结果:

{Go 语言 fanguiju Go 语言编程 1}
{Go 语言 fanguiju Go 语言编程 1}
{Go 语言 fanguiju  0}

访问结构体成员

使用 . 成员访问符,来访问结构体的成员。

package main

import "fmt"

type book_s struct {
    title   string
    author  string
    subject string
    book_id int
}

func main() {
   var book1 book_s

   book1.title = "Go 语言"
   book1.author = "fanguiju"
   book1.subject = "Go 语言编程"
   book1.book_id = 1

   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)
}

结果:

Book 1 title : Go 语言
Book 1 author : fanguiju
Book 1 subject : Go 语言编程
Book 1 book_id : 1

向函数传递结构体

你可以像其他数据类型一样将结构体类型变量作为参数传递给函数,结构体是作为实参时采用的是值传递。

package main

import "fmt"

type book_s struct {
    title   string
    author  string
    subject string
    book_id int
}

func print_book_infos(book book_s) {
    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)
}

func main() {
    var book1 book_s

    book1.title = "Go 语言"
    book1.author = "fanguiju"
    book1.subject = "Go 语言编程"
    book1.book_id = 1

    print_book_infos(book1)
}

结果:

Book title: Go 语言
Book author: fanguiju
Book subject: Go 语言编程
Book book_id: 1

结构体指针

相对的,将结构体指针类型变量作为函数实参传入时,肯定是引用语义的。Golang 中访问结构体指针类型变量的成员时,依然使用成员访问符 .,而不像 C 语言那样会有特殊的地址访问符 ->

示例:

package main

import "fmt"

type book_s struct {
    title   string
    author  string
    subject string
    book_id int
}


func print_book_infos(book *book_s) {
    fmt.Println( "Book title: %s", book.title)
    fmt.Println( "Book author: %s", book.author)
    fmt.Println( "Book subject: %s", book.subject)
    fmt.Println( "Book book_id: %d", book.book_id)
}

func change(book *book_s) {
    book.book_id = 2
}

func main() {
    var book1 book_s

    book1.title = "Go 语言"
    book1.author = "fanguiju"
    book1.subject = "Go 语言编程"
    book1.book_id = 1
    print_book_infos(&book1)
    fmt.Println("---------")

    change(&book1)
    print_book_infos(&book1)
}

结果:

Book title: %s Go 语言
Book author: %s fanguiju
Book subject: %s Go 语言编程
Book book_id: %d 1
---------
Book title: %s Go 语言
Book author: %s fanguiju
Book subject: %s Go 语言编程
Book book_id: %d 2

结构体标签(Struct Tag)

Go 语言编程 — reflect 反射工具

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
目录: 第1章 5个例子 1 1.1 开始 1 1.2 编辑、编译和运行 3 1.3 Hello Who? 6 1.4 大数字——二维切片 8 1.5 栈——自定义类型及其方法 12 1.6 americanise示例——文件、映射和闭包 18 1.7 从极坐标到笛卡儿坐标 ——并发 28 1.8 练习 33 第2章 布尔与数值类型 35 2.1 基础 35 2.2 布尔值和布尔表达式 39 2.3 数值类型 40 2.3.1 整型 42 2.3.2 浮点类型 46 2.4 例子:statistics 53 2.4.1 实现一个简单的统计函数 54 2.4.2 实现一个基本的HTTP服务器 55 2.5 练习 58 第3章 字符串 60 3.1 字面量、操作符和转义 61 3.2 比较字符串 63 3.3 字符和字符串 65 3.4 字符串索引与切片 67 3.5 使用fmt包来格式化字符串 69 3.5.1 格式化布尔值 73 3.5.2 格式化整数 74 3.5.3 格式化字符 75 3.5.4 格式化浮点数 75 3.5.5 格式化字符串和切片 76 3.5.6 为调试格式化 78 3.6 其他字符处理相关的包 80 3.6.1 strings包 81 3.6.2 strconv包 86 3.6.3 utf8包 90 3.6.4 unicode包 91 3.6.5 regexp包 92 3.7 例子:m3u2pls 101 3.8 练习 106 第4章 集合类型 108 4.1 值、指针和引用类型 108 4.2 数组和切片 115 4.2.1 索引与分割切片 119 4.2.2 遍历切片 119 4.2.3 修改切片 121 4.2.4 排序和搜索切片 125 4.3 映射 128 4.3.1 创建和填充映射 129 4.3.2 映射查询 131 4.3.3 修改映射 132 4.3.4 键序遍历映射 132 4.3.5 映射反转 133 4.4 例子 134 4.4.1 猜测分隔符 134 4.4.2 词频统计 136 4.5 练习 141 第5章 过程式编程 144 5.1 语句基础 144 5.1.1 类型转换 147 5.1.2 类型断言 148 5.2 分支 149 5.2.1 if语句 150 5.2.2 switch语句 151 5.3 for循环语句 158 5.4 通信和并发语句 160 5.5 defer、panic和recover 166 5.6 自定义函数 171 5.6.1 函数参数 172 5.6.2 init()函数和main()函数 175 5.6.3 闭包 176 5.6.4 递归函数 178 5.6.5 运行时选择函数 181 5.6.6 泛型函数 183 5.6.7 高阶函数 187 5.7 例子:缩进排序 192 5.8 练习 197 第6章 面向对象编程 199 6.1 几个关键概念 199 6.2 自定义类型 201 6.2.1 添加方法 203 6.2.2 验证类型 207 6.3 接口 209 6.4 结构体 217 6.5 例子 224 6.5.1 FuzzyBool——一个单值自定义类型 224 6.5.2 Shapes——一系列自定义类型 229 6.5.3 有序映射——一个通用的集合类型 240 6.6 练习 248 第7章 并发编程 251 7.1 关键概念 252 7.2 例子 256 7.2.1 过滤器 256 7.2.2 并发的Grep 260 7.2.3 线程安全的映射 266 7.2.4 Apache报告 271 7.2.5 查找副本 278 7.3 练习 285 第8章 文件处理 287 8.1 自定义数据文件 287 8.1.1 处理JSON文件 290 8.1.2 处理XML文件 295 8.1.3 处理纯文本文件 301 8.1.4 处理Go语言二进制文件 307 8.1.5 处理自定义的二进制文件 309 8.2 归档文件 317 8.2.1 创建zip归档文件 317 8.2.2 创建可压缩的tar包 319 8.2.3 解开zip归档文件 321 8.2.4 解开tar归档文件 322 8.3 练习 324 第9章 包 326 9.1 自定义包 326 9.1.1 创建自定义的包 327 9.1.2 导入包 333 9.2 第三方包 334 9.3 Go命令行工具简介 335 9.4 Go标准库简介 336 9.4.1 归档和压缩包 336 9.4.2 字节流和字符串相关的包 336 9.4.3 容器包 337 9.4.4 文件和操作系统相关的包 339 9.4.5 图像处理相关的包 341 9.4.6 数学处理包 341 9.4.7 其他一些包 341 9.4.8 网络包 342 9.4.9 反射包 343 9.5 练习 346

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范桂飓

文章对您有帮助就请一键三连:)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值