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语言-在mac下brew升级golang
Apr 25 Golang
Go语言中的UTF-8实现
Apr 26 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
Go 在 MongoDB 中常用查询与修改的操作
May 07 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Go语言grpc和protobuf
Apr 13 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 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
PHP4在WinXP下IIS和Apache2服务器上的安装实例
2006/10/09 PHP
PHP 安全检测代码片段(分享)
2013/07/05 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
php的ddos攻击解决方法
2015/01/08 PHP
php在linux下检测mysql同步状态的方法
2015/01/15 PHP
PHPExcel内存泄漏问题解决方法
2015/01/23 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
checkbox 复选框不能为空
2009/07/11 Javascript
JS 文件传参及处理技巧分析
2010/05/13 Javascript
js分解url参数(面向对象-极简主义法应用)
2012/08/09 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
jQuery实现的简单拖拽功能示例
2016/09/13 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
vue 获取视频时长的实例代码
2019/08/20 Javascript
vue props default Array或是Object的正确写法说明
2020/07/30 Javascript
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python获取指定字符前面的所有字符方法
2018/05/02 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
使用CSS3美化HTML表单的技巧演示
2016/05/17 HTML / CSS
介绍一下XMLHttpRequest对象
2012/02/12 面试题
农民工工资支付承诺书
2015/05/04 职场文书
Mysql案例刨析事务隔离级别
2021/09/25 MySQL
Python各协议下socket黏包问题原理
2022/04/12 Python