目录

文章目录

  • 目录
  • 结构体
  • 访问结构体成员
  • 向函数传递结构体
  • 结构体指针
  • 结构体标签(Struct Tag)

结构体

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 mainimport "fmt"type book_s struct {title   stringauthor  stringsubject stringbook_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 mainimport "fmt"type book_s struct {title   stringauthor  stringsubject stringbook_id int
}func main() {var book1 book_sbook1.title = "Go 语言"book1.author = "fanguiju"book1.subject = "Go 语言编程"book1.book_id = 1fmt.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 mainimport "fmt"type book_s struct {title   stringauthor  stringsubject stringbook_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_sbook1.title = "Go 语言"book1.author = "fanguiju"book1.subject = "Go 语言编程"book1.book_id = 1print_book_infos(book1)
}

结果:

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

结构体指针

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

示例:

package mainimport "fmt"type book_s struct {title   stringauthor  stringsubject stringbook_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_sbook1.title = "Go 语言"book1.author = "fanguiju"book1.subject = "Go 语言编程"book1.book_id = 1print_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 反射工具》

Go 语言编程 — 高级数据类型 — 结构体相关推荐

  1. C 语言编程 — 高级数据类型 — 结构体与位域

    目录 文章目录 目录 前文列表 结构体 定义结构体 初始化结构体变量 访问结构体成员 结构体的内存分布 将结构体作为实参传入函数 指向结构体变量的指针 位域 定义位域 使用位域结构体的成员 前文列表 ...

  2. C 语言编程 — 高级数据类型 — 共用体

    目录 文章目录 目录 前文列表 共用体 定义共用体 访问共用体成员 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本 ...

  3. C 语言编程 — 高级数据类型 — void 类型

    目录 文章目录 目录 前文列表 void 类型 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本数据类型> & ...

  4. C 语言编程 — 高级数据类型 — 字符串

    目录 文章目录 目录 前文列表 字符串 字符串拷贝 字符串比较 strcmp strncmp 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> &l ...

  5. C 语言编程 — 高级数据类型 — 枚举

    目录 文章目录 目录 前文列表 声明枚举类型 定义枚举类型的变量 枚举类型变量的枚举值 枚举在 switch 语句中的使用 将整型转换为枚举类型 前文列表 <程序编译流程与 GCC 编译器> ...

  6. C 语言编程 — 高级数据类型 — 数组

    目录 文章目录 目录 前文列表 数组 声明数组 初始化数据 访问数组元素 二维数组 指向数组的指针 将数组指针作为实参传入函数 从函数返回一个数组指针 指针数组 数组名和取数组首地址的区别 前文列表 ...

  7. C 语言编程 — 高级数据类型 — 指针

    目录 文章目录 目录 前文列表 指针 声明一个指针变量 使用指针 空指针 悬空指针 野指针 指针的算术运算 指向指针的指针 将指针作为实际参数传入函数 从函数返回指针 一个古老的笑话 前文列表 < ...

  8. Go 语言编程 — 高级数据类型 — Interface、多态、Duck Typing 与泛式编程

    目录 文章目录 目录 Golang 的接口 Interface 实例存储的是实现者的值 如何判断某个 Interface 实例的实际类型 Empty Interface Interface 与多态 I ...

  9. Go 语言编程 — 高级数据类型 — 数组

    目录 文章目录 目录 数组 定义数组 数组与切片的区别 访问数组元素 多维数组 初始化二维数组 访问二维数组 向函数传递数组 指针数组 数组 数组是具有相同数据类型的一组已编号且长度固定的数据项序列, ...

最新文章

  1. 算法基础知识科普:8大搜索算法之二叉搜索树(上)
  2. 微服务架构实战项目Serverless的持续交付与架构案例
  3. 【Android View事件分发机制】滑动冲突
  4. VS2008 + Silverlight初步学习
  5. 华为首款搭载鸿蒙os 荣耀智慧屏,全球首款搭载鸿蒙OS终端! 荣耀智慧屏将在今天拉开面纱...
  6. java 图片批量上传_java实现批量上传图片,还要保证每个图片的顺序号,疑问求教!...
  7. 联合使用 HTML 5、地理定位 API
  8. 前端项目,将package.json数据放到项目某处使用
  9. Caffe100数据集使用
  10. xulrunner弹出窗口不显示解决方法
  11. c语言数据页,c语言基础--数据类型(51页)-原创力文档
  12. 小程序之跨平台黑魔法
  13. 跟我一起玩转A870省电内核、超频内核
  14. 基于EEG信号的文献记录01(0719)-特征选择和分类算法在基于脑电信号的睡眠阶段分类中的比较研究
  15. 抖音的计算机技术优势,抖音成功的优势在哪里?
  16. swift野梦抄袭 taylor_如何看待蔡健雅新歌《半途》被指抄袭 Taylor Swift 的《Safe Sound》?...
  17. 【饭谈】谈谈所有人都曾经对测开技术的迷茫和恐惧
  18. 利用千人基因组数据库查看SNP在不同地区、国家、洲的频率及个数
  19. css and HTMLpicture knowledge
  20. 设计模式-备忘录模式(快照模式)

热门文章

  1. 分享Kali Linux 2016.2第47周虚拟机
  2. android ffmpeg 简书,偶遇FFmpeg(三)——Android集成
  3. excel字段自动java类,Java 接口自动化系列--工具类之Excel测试数据解析封装
  4. 计算机类和鼠标类是什么关系,常见鼠标的种类
  5. java string逆序_Java学习笔记(八)——异常
  6. mysql去除输入的字符串中的中文_Sql得到(去除)字符串中所有汉字,字母,数字的函数...
  7. 脑电分析系列[MNE-Python-5]| Python机器学习算法随机森林判断睡眠类型
  8. Htc Vive VR 手势识别插件教程 1.1 版本(附1.0版本教程PDF)
  9. 蜘蛛仅靠电场就能起飞,连风都不需要,网友:懂了,蜘蛛会用原力
  10. 外国小哥恶搞:用ESP32单片机伪装成GPU,让朋友电脑中“勒索病毒