Go 语言结构体

简介: Go 语言结构体

Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性:

  • Title :标题
  • Author : 作者
  • Subject:学科
  • ID:书籍ID

定义结构体

结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下:

type struct_variable_type struct {

  member definition

  member definition

  ...

  member definition

}

一旦定义了结构体类型,它就能用于变量的声明,语法格式如下:

variable_name := structure_variable_type {value1, value2...valuen}

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

实例如下:

实例

package main


import "fmt"


type Books struct {

  title string

  author string

  subject string

  book_id int

}



func main() {


   // 创建一个新的结构体

   fmt.Println(Books{"Go 语言", "www.runoob.com", "Go 语言教程", 6495407})


   // 也可以使用 key => value 格式

   fmt.Println(Books{title: "Go 语言", author: "www.runoob.com", subject: "Go 语言教程", book_id: 6495407})


   // 忽略的字段为 0 或 空

  fmt.Println(Books{title: "Go 语言", author: "www.runoob.com"})

}

输出结果为:

{Go 语言 www.runoob.com Go 语言教程 6495407}

{Go 语言 www.runoob.com Go 语言教程 6495407}

{Go 语言 www.runoob.com  0}


访问结构体成员

如果要访问结构体成员,需要使用点号 . 操作符,格式为:

结构体.成员名"

结构体类型变量使用 struct 关键字定义,实例如下:

实例

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)

}

以上实例执行运行结果为:

Book 1 title : Go 语言

Book 1 author : www.runoob.com

Book 1 subject : Go 语言教程

Book 1 book_id : 6495407

Book 2 title : Python 教程

Book 2 author : www.runoob.com

Book 2 subject : Python 语言教程

Book 2 book_id : 6495700


结构体作为函数参数

你可以像其他数据类型一样将结构体类型作为参数传递给函数。并以以上实例的方式访问结构体变量:

实例

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)

}

以上实例执行运行结果为:

Book title : Go 语言

Book author : www.runoob.com

Book subject : Go 语言教程

Book book_id : 6495407

Book title : Python 教程

Book author : www.runoob.com

Book subject : Python 语言教程

Book book_id : 6495700


结构体指针

你可以定义指向结构体的指针类似于其他指针变量,格式如下:

var struct_pointer *Books

以上定义的指针变量可以存储结构体变量的地址。查看结构体变量地址,可以将 & 符号放置于结构体变量前:

struct_pointer = &Book1

使用结构体指针访问结构体成员,使用 "." 操作符:

struct_pointer.title

接下来让我们使用结构体指针重写以上实例,代码如下:

实例

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)

}

以上实例执行运行结果为:

Book title : Go 语言

Book author : www.runoob.com

Book subject : Go 语言教程

Book book_id : 6495407

Book title : Python 教程

Book author : www.runoob.com

Book subject : Python 语言教程

Book book_id : 6495700

目录
相关文章
|
4月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
276 1
|
12月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
12月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
6月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
380 1
|
6月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
464 0
|
6月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
313 0
|
6月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
334 0
|
6月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
374 0
|
6月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
6月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。