Go 语言 结构体

简介: 引言Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型结构体是由一系列具有相同类型或不同类型的数据构成的数据集合结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性:Title :标题Author : 作者Subject:学科ID:书籍ID 

一、定义结构


1. 语法格式


  • 结构体定义需要使用 typestruct 语句
  • 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}


2. 示例


package main
import "fmt"
type Persion struct {
 name    string
 sex     string
 age     int
 id_card int
}
func main() {
 //创建一个新的结构体
 fmt.Println(Persion{"zhangsan", "男", 20, 123412424})
 //使用key:value格式
 fmt.Println(Persion{name: "lisi", sex: "女", age: 18, id_card: 133654623})
 //忽略的字段为0或空
 fmt.Println(Persion{name: "wangwu", id_card: 21352365})
}
//输出结果
{zhangsan 男 20 123412424}
{lisi 女 18 133654623}
{wangwu  0 21352365}


二、访问结构体成员


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

结构体.成员名"



  • 结构体类型变量使用 struct 关键字定义,实例如下:
package main
import "fmt"
func main() {
 //结构体声明
 type Persion struct {
  name string
  age  int
  sex  string
  id   int
 }
 //结构体类型的变量
 var (
  Persion1 Persion //声明 Persion1 为 Persion 类型
  Persion2 Persion //声明 Persion2 为 Persion 类型
 )
 //给prison1赋值
 Persion1.name = "lisi"
 Persion1.sex = "man"
 Persion1.age = 30
 Persion1.id = 56341153
 //给prison2赋值
 Persion2.name = "wangwu"
 Persion2.sex = "woman"
 Persion2.age = 18
 Persion2.id = 78238232
 fmt.Println(Persion1)
 fmt.Println(Persion2)
}
//输出结果如下
{lisi 30 man 56341153}
{wangwu 18 woman 78238232}


三、结构体作为函数参数


结构体也可以作为参数传递给函数,可以解决一些代码的冗余问题,简化代码

  • 示例
package main
import "fmt"
//结构体声明
type Persion struct {
 name string
 age  int
 sex  string
 id   int
}
func main() {
 //结构体类型的变量
 var (
  Persion1 Persion //声明 Persion1 为 Persion 类型
  Persion2 Persion //声明 Persion2 为 Persion 类型
 )
 //给prison1赋值
 Persion1.name = "lisi"
 Persion1.sex = "man"
 Persion1.age = 30
 Persion1.id = 56341153
 //给prison2赋值
 Persion2.name = "wangwu"
 Persion2.sex = "woman"
 Persion2.age = 18
 Persion2.id = 78238232
 //使用函数传递结构体
 printInfo(Persion1)
 fmt.Println("------------------")
 printInfo(Persion2)
}
//函数定义结构体为形式参数,进行传入
func printInfo(p Persion) {
 fmt.Println("姓名: ", p.name)
 fmt.Println("年龄: ", p.age)
 fmt.Println("性别: ", p.sex)
 fmt.Println("身份证: ", p.id)
}
//输出结果如下
姓名:  lisi
年龄:  30
性别:  man
身份证:  56341153
------------------
姓名:  wangwu
年龄:  18
性别:  woman
身份证:  78238232

 

四、结构体指针


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

var struct_pointer *Persion


 

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

struct_pointer = &Persion1


 

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

struct_pointer.title



package main
import "fmt"
//结构体声明
type Persion struct {
 name string
 age  int
 sex  string
 id   int
}
func main() {
 //结构体类型的变量
 var (
  Persion1 Persion //声明 Persion1 为 Persion 类型
  Persion2 Persion //声明 Persion2 为 Persion 类型
 )
 //给prison1赋值
 Persion1.name = "lisi"
 Persion1.sex = "man"
 Persion1.age = 30
 Persion1.id = 56341153
 //给prison2赋值
 Persion2.name = "wangwu"
 Persion2.sex = "woman"
 Persion2.age = 18
 Persion2.id = 78238232
 //使用函数传递结构体的地址
 printInfo(&Persion1)
 fmt.Println("------------------")
 printInfo(&Persion2)
}
//定义结构体指针形参进行传入
func printInfo(p *Persion) {
 fmt.Println("姓名: ", p.name)
 fmt.Println("年龄: ", p.age)
 fmt.Println("性别: ", p.sex)
 fmt.Println("身份证: ", p.id)
}
//输出结果如下
姓名:  lisi
年龄:  30
性别:  man
身份证:  56341153
------------------
姓名:  wangwu
年龄:  18
性别:  woman
身份证:  78238232

总结


结构体是由相同类型和不同类型组成的数据集合,存储的结构类型是不受限制的

相关文章
|
17天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
27 7
|
17天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
17天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
92 71
|
16天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
100 67
|
19天前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
90 62
|
21天前
|
并行计算 安全 Go
Go语言中的并发编程:掌握goroutines和channels####
本文深入探讨了Go语言中并发编程的核心概念——goroutine和channel。不同于传统的线程模型,Go通过轻量级的goroutine和通信机制channel,实现了高效的并发处理。我们将从基础概念开始,逐步深入到实际应用案例,揭示如何在Go语言中优雅地实现并发控制和数据同步。 ####
|
17天前
|
存储 Go
go语言中映射
go语言中映射
32 11
|
19天前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
29 12
|
18天前
|
Go 索引
go语言使用索引遍历
go语言使用索引遍历
27 9
|
22天前
|
安全 Serverless Go
Go语言中的并发编程:深入理解与实践####
本文旨在为读者提供一个关于Go语言并发编程的全面指南。我们将从并发的基本概念讲起,逐步深入到Go语言特有的goroutine和channel机制,探讨它们如何简化多线程编程的复杂性。通过实例演示和代码分析,本文将揭示Go语言在处理并发任务时的优势,以及如何在实际项目中高效利用这些特性来提升性能和响应速度。无论你是Go语言的初学者还是有一定经验的开发者,本文都将为你提供有价值的见解和实用的技巧。 ####