三天Golang快速入门—结构体
Struct结构体
- 什么是结构体
- 结构体定义
- 基本实例化
- new实例化
- 键值对初始化
- 结构体方法和接收者
- 结构体说明
- 结构体方法和接收者
- 值类型和指针类型接收者
- struct与json
- struct转json字符串
- json转struct
- struct tag
- Tag结构体转化Json字符串
- Json字符串转成Tag结构体
什么是结构体
1.Golang中没有类的概念,也不支持类的继承等面向对象的概念
2.所以Go通过结构体的内嵌再配合接口实现比面向对更高的扩展性和灵活性
结构体定义
基本实例化
package mainimport "fmt"type person struct {name stringcity stringage int
}func main() {/*只有当结构体实例化时,才会分配内存,也就是说必须实例化后才能使用结构体的字段*/var p1 personp1.name = "张三"p1.city = "上海"p1.age = 20fmt.Printf("p1=%v\n", p1) // p1={张三 上海 20}fmt.Printf("p1=%#v\n", p1) // p1=main.person{name:"张三", city:"上海", age:20}
}
new实例化
package mainimport "fmt"type person struct {name stringcity stringage int
}func main() {/*还可以通过new关键字对结构退进行实例化,得到的是结构体的地址*/var p1 = new(person)p1.name = "张三" // 底层是用的指针 (*p1).name = "张三"p1.city = "上海"p1.age = 20fmt.Printf("p1=%#v\n", p1) //p1=&main.person{name:"张三", city:"上海", age:20}
}
键值对初始化
package mainimport "fmt"type person struct {name stringcity stringage int
}func main() {p1 := person{name: "张三",city: "上海",age: 20,}fmt.Printf("p1=%#v\n", p1) // p1=main.person{name:"张三", city:"上海", age:20}
}
结构体方法和接收者
结构体说明
- Go中没有类的概念,但是可以给类型(结构体、自定义类型)定义方法
- 所谓方法就是定义了接收者的函数。
- 方法的定义格式如下:
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {函数体}
结构体方法和接收者
package mainimport "fmt"type Person struct {name stringage int
}func (p Person) printInfo() {fmt.Printf("姓名:%v 年龄:%v\n", p.name, p.age)
}func main() {p := Person{name: "小红",age: 20,}p.printInfo() // 姓名:小红 年龄:20
}
值类型和指针类型接收者
1、值类型的接收者
当方法作用于值类型接收者时,会在代码运行时将接收者的值复制一份。
在值类型接收者的方法中可以获取接收者我的成员值,但修改操作只是针对副本,无法修改接收者变量本身
2、指针类型的接收者
指针类型的接收者由一个结构体的指针组成
指针大家够知道,修改是直接修改内存中指向的地址值,所以修改的是原数据的值
package mainimport "fmt"type Person struct {name stringage int
}//值类型接收者
func (p Person) printInfo() {fmt.Printf("姓名:%v 年龄:%v\n", p.name, p.age)
}//指针类型接收者
func (p *Person) setInfo(name string, age int) {p.name = namep.age = age
}func main() {p := Person{name: "小红",age: 20,}p.printInfo() // 姓名:小红 年龄:20p.setInfo("张三", 30)p.printInfo() // 姓名:张三 年龄:30
}
struct与json
- 在写后台接口时需要提供json数据,就要用到结构图和json间的转换
- JSON序列化是把结构体数据转化成JSON
- JSON反序列化是把JSON数据转化成结构体对象
- 序列化和反序列化主要通过’encoding/json’包中的json.Marshal()和json.Unmarshal()方法
struct转json字符串
package mainimport ("encoding/json""fmt"
)type Student struct {ID intGender stringname stringSon string
}func main() {var s1 = Student{ID: 1,Gender: "男",name: "傻宝",Son: "s001",}fmt.Printf("%#v\n", s1) // main.Student{ID:1, Gender:"男", name:"傻宝", Son:"s001"}var s, _ = json.Marshal(s1)jsonStr := string(s)fmt.Println(jsonStr) //{"ID":1,"Gender":"男","Son":"s001"}
}
json转struct
package mainimport ("encoding/json""fmt"
)type Student struct {ID intGender stringName stringSon string
}func main() {var jsonStr = `{"ID":1, "Gender":"男", "Name":"傻宝", "Son":"s001"}`var student Studenterr := json.Unmarshal([]byte(jsonStr), &student)if err != nil {fmt.Println("unmarshal err:", err)}fmt.Printf("反序列化后 student=%#v student.Name=%v \n", student, student.Name)// 反序列化后 student=main.Student{ID:1, Gender:"男", Name:"傻宝", Son:"s001"} student.Name=傻宝
}
struct tag
- Tag是结构体的元信息,可以在运行时通过反射机制读取出来
Tag结构体转化Json字符串
package mainimport ("encoding/json""fmt"
)type Student struct {ID int `json:"id"` // 通过 tag 实现json序列化该字段时的keyGender string `json:"gender"`Name stringSon string
}func main() {var s1 = Student{ID: 1,Gender: "女",Name: "李四",Son: "s002",}fmt.Printf("%#v\n", s1) // main.Student{ID:1, Gender:"女", Name:"李四", Son:"s002"}var s, _ = json.Marshal(s1)jsoStr := string(s)fmt.Println(jsoStr) // main.Student{ID:1, Gender:"女", Name:"李四", Son:"s002"}
}
Json字符串转成Tag结构体
package mainimport ("encoding/json""fmt"
)type Student struct {ID int `json:"id"` // 通过 tag 实现json序列化该字段时的keyGender string `json:"gender"`Name stringSon string
}func main() {var s3 StudentjsonStr := `{"id":1,"gender":"女","Name":"李四","Son":"s002"}`err := json.Unmarshal([]byte(jsonStr), &s3)if err != nil {fmt.Println(err)}fmt.Printf("%#v\n", s3) // {"id":1,"gender":"女","Name":"李四","Son":"s002"}
}相关文章:
三天Golang快速入门—结构体
Struct结构体什么是结构体结构体定义基本实例化new实例化键值对初始化结构体方法和接收者结构体说明结构体方法和接收者值类型和指针类型接收者struct与jsonstruct转json字符串json转structstruct tagTag结构体转化Json字符串Json字符串转成Tag结构体什么是结构体 1.Golang中没…...
日常算法刷题——力扣704
##2023/3/2 刷算法的第一天 针对力扣的704题:本题是二分查找的基本使用!在此需要注意二分查找的基本特点: 1.数列基本有序; 2.数列数据内容不可重复。 此题只需了解二分查找算法的基本概念,无坑可跳。但在力扣上刷题就…...
【服务器数据恢复】VMware虚拟机下的SQL Server数据库数据恢复案例
服务器数据恢复环境: 一台某品牌PowerEdge系列服务器和一台PowerVault系列存储,上层是ESXI虚拟机文件,虚拟机中运行SQL Server数据库。 服务器故障: 机房非正常断电导致虚拟机无法启动。管理员检查虚拟机发现虚拟机配置文件丢失&…...
详解旨在提升EVM底层性能的兼容公链Monad
EVM带来的繁荣2020年以太坊链上DeFi的蓬勃发展使得EVM成为关注焦点,大部分DeFi项目都开始基于以太坊公链,这也使得EVM成为行业的标杆,不少链都加入了EVM大军,比如polygon、BSC、fantom等等,而EVM也使得链上生态进一步繁…...
2023社会工作者证书怎么考 在哪里报名考试
考取社会工作者证需要在网上报名,社工证是证书考试,分为初级、中级和高级三个级别,一般情况下满足报考条件就可以进行报考了,在中国人事考试网上进行报名及缴费。 1考取社会工作者证的流程 1、社工证报名需要登录中国人事考试网&a…...
统计学 类别比变量的判断
文章目录类别比变量的判断一个类别变量的拟合优度检验两个类别变量的独立性检验列联表与 χ2\chi^2χ2 独立性检验应用 χ2\chi^2χ2 检验应该注意的问题两个类别变量的相关度检验φ\varphiφ 系数Cramers VVV 系数列联系数总结类别比变量的判断 一个类别变量的拟合优度检验 …...
2.基于Label studio的训练数据标注指南:(智能文档)文档抽取任务、PDF、表格、图片抽取标注等
文档抽取任务Label Studio使用指南 1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取)、文本分类等 2.基于Label studio的训练数据标注指南:(智能文档)文档抽取任务、PDF、表格、图片抽取标注等…...
如何在openKylin操作系统上搭建Qt开发环境
一、获取linux系统下的Qt安装包 Qt官网下载地址:https://download.qt.io 国内镜像下载地址:https://mirrors.cloud.tencent.com/qt/ 。建议用镜像下载速度快。集成安装包在 official_releases/qt 目录下,新地址:https://downloa…...
T_SQL和SQL的区别
一. SQL Server和T-SQL的区别(⭐T-SQL 包含了 SQL)SQL Server是结构化查询语言,是目前关系型数据库管理系统中使用最广泛的查询语言T-SQL是标准SQL语言的扩展,是SQL Server的核心,在SQL的的基础上添加了变量,运算符,函数和流程控制等,Microso…...
用Python自己写一个分词器,python实现分词功能,隐马尔科夫模型预测问题之维特比算法(Viterbi Algorithm)的Python实现
☕️ 本文系列文章汇总: (1)HMM开篇:基本概念和几个要素 (2)HMM计算问题:前后向算法 代码实现 (3)HMM学习问题:Baum-Welch算法 代码实现(…...
刷题笔记2 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结
977.有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 […...
python 支付宝营销活动现金红包开发接入流程-含接口调用加签
1 创建网页/移动应用 2 配置接口加签方式 涉及到金额的需要上传证书,在上传页面有教程, 在支付宝开放平台秘钥工具中生成CSR证书,会自动保存应用公钥和私钥到电脑上,调用支付宝接口需要应用私钥进行加签 上传完CSR证书后会有三个…...
Python操作Windows
用python进行windows端UI自动化的库有很多,比如pywinauto等,本文介绍一个使用autoit3来实现的 pyautoit 库pyautoit 是一个用python写的基于AutoItX3.dll的接口库,用来进行windows窗口的一系列操作,也支持鼠标键盘的操作。安装pip…...
Aptos SDK交互笔记(一)
背景 之前我们已经了解TS的一些语法,接下来可以实战训练下,这系列的文章就会介绍如何通过Aptos官网提供的TypeScript SDK与Aptos进行交互,这篇文章主要讲的就是如何使用提供API在aptos区块链上转帐。 官网示例 官网提供了交互的例子&#…...
汽车 12V 和 24V 电池输入保护推荐
简介汽车电池电源线路在运行系统时容易出现瞬变。所需的典型保护包括过压、过载、反极性和跨接启动。在汽车 的生命周期中,交流发电机可能会被更换为非OEM 部件。售后市场上的交流发电机可能具有不同的负载突降(LOAD DUMP)保护或没有负载突降…...
龙蜥LoongArch架构研发全揭秘,龙芯开辟龙腾计划技术合作新范式
编者按:在开源新基建加快建设的背景下,越来越多的企业选择加入龙蜥社区,当前社区生态合作伙伴已突破 300 家。于是,龙蜥社区能为加入的企业提供哪些支持成为越多伙伴们更加关注的话题。本文将以龙蜥社区和龙芯中科联合研发龙蜥 Lo…...
剑指 Offer 16. 数值的整数次方
摘要 剑指 Offer 16. 数值的整数次方 本题的方法被称为快速幂算法,有递归和迭代两个版本。这篇题解会从递归版本的开始讲起,再逐步引出迭代的版本。当指数n为负数时,我们可以计算 x^(-n)再取倒数得到结果,因此我们只需要考虑n为…...
在苹果电脑 mac 上安装原神(playCover)
该方法只能在 M1、M2 mac 上安装原神 目录前言一、首先下载安装 playCover1. playCover 下载2. playCover 安装安装出现问题解决方法二、下载安装原神1.安装包下载2.安装原神三、登录、键盘映射及版本更新等问题登录键盘映射版本更新前言 最近买了新的mac,作者本人…...
数据结构考研习题精选
1 A假设比较t次,由于换或不换,则必然有2^t种可能。又设有n个关键字,n!排列组合,则必然有2^t&…...
linux常用命令介绍 04 篇——uniq命令使用介绍(Linux重复数据的统计处理)
linux常用命令介绍 04 篇——uniq命令使用介绍(Linux重复数据的统计处理)1. uniq 使用语法2. sort 简单效果3. uniq 使用例子3.1 不加任何选项3.1.1 不用 sort 效果3.1.2 uniq 结合 sort 一起使用3.2 使用选项例子3.2.1 去重打印(或打印不重复…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
