news 2026/6/24 0:03:10

Go 语言结构体

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 1:48:29

Week 29: 深度学习补遗:MoE的稳定性机制与路由策略实现

文章目录Week 29: 深度学习补遗:MoE的稳定性机制与路由策略实现摘要Abstract1. Noisy Top-K Router1.1 理论背景1.2 代码实现2. Token 级与 Pooling 级路由2.1 理论背景2.2 代码实现3. Auxiliary Loss3.1 理论背景3.2 代码实现总结Week 29: 深度学习补遗&#xff1a…

作者头像 李华
网站建设 2026/6/23 1:07:50

25年12月14日复盘总结,大盘方向,操作建议,板块机会,实用干货

25年12月14日复盘总结,大盘方向,操作建议,板块机会,实用干货大盘指数经过近一个季度回调半指的风险得到了极大的释放,指数走出了三段4的调整,那在这个位置我们就不应该再看风险,三段4的调整已经…

作者头像 李华
网站建设 2026/6/23 18:23:31

what?动态规划?

动态规划入门:从原理到实战,吃透基础算法动态规划(Dynamic Programming,简称 DP)是算法领域的核心思想之一,也是面试、竞赛中的高频考点。它并非单一算法,而是一种 “化繁为简” 的解题思路 ——…

作者头像 李华
网站建设 2026/6/23 18:25:02

CommonJS 的缓存机制:为什么二次 require 得到的对象是同一个?

各位同仁,下午好!今天,我们将深入探讨 Node.js 中 CommonJS 模块系统的核心机制之一:模块缓存。这是一个看似简单却蕴含深厚设计哲学的机制,它直接决定了我们在 Node.js 应用中管理状态、优化性能以及理解模块行为的关…

作者头像 李华
网站建设 2026/6/23 18:20:41

跨标签页通信的五种方案:LocalStorage、BroadcastChannel 与 SharedWorker

各位同仁,下午好!今天,我们将深入探讨前端开发中一个既常见又关键的议题:跨标签页通信。在现代Web应用中,用户经常会同时打开多个标签页或窗口来访问同一个网站的不同部分,或者处理同一任务的不同阶段。在这…

作者头像 李华