Golang 结构体数据集合


Posted in Golang onApril 22, 2022

引言

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

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

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

Title :标题

Author : 作者

Subject:学科

ID:书籍ID

一、定义结构体

1. 语法格式

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

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

总结

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


Tags in this post...

Golang 相关文章推荐
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
解决Go gorm踩过的坑
Apr 30 Golang
Golang 编译成DLL文件的操作
May 06 Golang
golang中的并发和并行
May 08 Golang
golang为什么要统一错误处理
Apr 03 Golang
Golang数据类型和相互转换
Apr 12 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Go获取两个时区的时间差
Apr 20 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
基于Python实现西西成语接龙小助手
Aug 05 Golang
go goth封装第三方认证库示例详解
Aug 14 Golang
Golang map映射的用法
Apr 22 #Golang
Golang bufio详细讲解
Apr 21 #Golang
Go获取两个时区的时间差
Apr 20 #Golang
Golang jwt身份认证
实现GO语言对数组切片去重
Apr 20 #Golang
Golang日志包的使用
Apr 20 #Golang
Golang获取List列表元素的四种方式
Apr 20 #Golang
You might like
PHP 和 MySQL 基础教程(三)
2006/10/09 PHP
php 动态执行带有参数的类方法
2009/04/10 PHP
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
Vue.js 事件修饰符的使用教程
2018/11/01 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
package.json中homepage属性的作用详解
2020/03/11 Javascript
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python基础教程之循环介绍
2014/08/29 Python
python MNIST手写识别数据调用API的方法
2018/08/08 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
Win10下python 2.7与python 3.7双环境安装教程图解
2019/10/12 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
Python多线程Threading、子线程与守护线程实例详解
2020/03/24 Python
python 装饰器的使用示例
2020/10/10 Python
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
快餐店的创业计划书范文
2014/01/29 职场文书
优秀党员推荐材料
2014/12/18 职场文书
2015年六一儿童节活动方案
2015/05/05 职场文书
2015年小学二年级班主任工作总结
2015/05/21 职场文书
我的生日感言
2015/08/03 职场文书
运动会广播稿50字
2015/08/19 职场文书