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 实现英尺和米的简单单位换算方式
Apr 29 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
go语言中fallthrough的用法说明
May 06 Golang
Golang中异常处理机制详解
Jun 08 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Go归并排序算法的实现方法
Apr 06 Golang
golang生成并解析JSON
Apr 14 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Python测试框架pytest核心库pluggy详解
Aug 05 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+MSSQL分页的例子
2006/10/09 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
Apache站点配置SSL强制跳转443
2021/03/09 Servers
js页面跳转的常用方法整理
2013/10/18 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
jquery cookie的用法总结
2013/11/18 Javascript
js取整数、取余数的方法
2014/05/11 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
2016/05/24 Javascript
简单的js计算器实现
2016/10/26 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
2019/05/14 Javascript
vue3实现v-model原理详解
2019/10/09 Javascript
实现一个Vue自定义指令懒加载的方法示例
2020/06/04 Javascript
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
Python中pip安装非PyPI官网第三方库的方法
2015/06/02 Python
浅谈django中的认证与登录
2016/10/31 Python
django使用xlwt导出excel文件实例代码
2018/02/06 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
Python如何发布程序的详细教程
2018/10/09 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
django form和field具体方法和属性说明
2020/07/09 Python
css3和jquery实现自定义checkbox和radiobox组件
2014/04/22 HTML / CSS
Brookstone美国官网:独特新奇产品
2017/03/04 全球购物
英国奢华护肤、美容和Spa品牌:Temple Spa
2019/11/02 全球购物
学校校庆演讲稿
2014/05/22 职场文书
2015年司法局工作总结
2015/05/22 职场文书
请病假条范文
2015/08/17 职场文书
关于教师节的广播稿
2015/08/19 职场文书
月考总结与反思
2015/10/22 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
React 高阶组件HOC用法归纳
2021/06/13 Javascript
JS class语法糖的深入剖析
2022/07/07 Javascript