当前位置: 首页 > news >正文

三天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算法 代码实现&#xff08…...

刷题笔记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 去重打印(或打印不重复…...

LFM2.5-1.2B-Thinking-GGUF应用场景:智能硬件说明书问答机器人落地实践

LFM2.5-1.2B-Thinking-GGUF应用场景:智能硬件说明书问答机器人落地实践 1. 项目背景与需求 在智能硬件领域,产品说明书往往存在以下痛点: 内容专业术语多,普通用户难以理解纸质说明书查找信息效率低不同型号产品差异导致用户混…...

煤矿电液阀系统摄像仪护套连接器 DLJ01(1000)参数

在煤矿综采工作面液压支架电液控制系统中,摄像仪护套连接器 DLJ01(1000)作为矿用本安型摄像仪与电源、信号传输线缆之间的专用接口,承担着视频信号与供电的稳定传输任务。其型号中的“1000”代表线缆长度为1000mm(1米)&#xff0c…...

从IMU初始化到点云去畸变:深入Fast-LIO2的传感器融合核心流程

从IMU初始化到点云去畸变:Fast-LIO2传感器融合全流程解析 在自动驾驶和机器人定位领域,激光雷达与IMU的紧耦合系统正成为高精度状态估计的主流方案。Fast-LIO2作为这一技术路线的代表,其核心创新在于将IMU的动力学特性与激光点云几何特征深度…...

别再只用Set5了!超分辨率模型训练,这5个开源数据集(DIV2K、Flickr2K等)的实战配置与对比

超分辨率模型训练:5个开源数据集的深度实战指南 在超分辨率研究领域,数据集的选择往往决定了模型性能的上限。许多开发者习惯性地使用Set5、Set14等小型数据集,却忽略了更丰富的数据资源可能带来的性能突破。本文将深入解析DIV2K、Flickr2K、…...

终极LxgwWenKai字体配置指南:如何为VSCode和IDEA打造完美中文编程体验

终极LxgwWenKai字体配置指南:如何为VSCode和IDEA打造完美中文编程体验 【免费下载链接】LxgwWenKai LxgwWenKai: 这是一个开源的中文字体项目,提供了多种版本的字体文件,适用于不同的使用场景,包括屏幕阅读、轻便版、GB规范字形和…...

Stable-Diffusion-v1-5-archive多分辨率实践:512×512 vs 768×768出图质量与耗时对比

Stable-Diffusion-v1-5-archive多分辨率实践:512512 vs 768768出图质量与耗时对比 你是不是也好奇,用Stable Diffusion出图时,分辨率到底该怎么选?是选经典的512512,还是追求更高清的768768?选高了怕电脑跑…...

Web地图开发避坑指南:墨卡托和UTM坐标系到底怎么选?

Web地图开发坐标系选择指南:墨卡托与UTM的深度对比 当我们打开手机地图应用查看附近餐厅时,很少有人会思考背后复杂的坐标系转换过程。作为一名长期从事WebGIS开发的工程师,我见过太多项目因为坐标系选择不当而导致定位偏移、性能下降甚至数据…...

Qwen3-32B-Chat微调实战:提升OpenClaw代码生成任务的准确性

Qwen3-32B-Chat微调实战:提升OpenClaw代码生成任务的准确性 1. 为什么需要微调Qwen3-32B-Chat? 去年夏天,当我第一次尝试用OpenClaw自动化我的开发工作流时,遇到了一个令人沮丧的问题:模型生成的代码虽然语法正确&am…...

企业级流程建模前端架构:基于Vite+Vue3的低代码解决方案

企业级流程建模前端架构:基于ViteVue3的低代码解决方案 【免费下载链接】vite-vue-bpmn-process 基于 Vite TypeScript Vue3 NaiveUI Bpmn.js 的流程编辑器(前端部分)。支持高度自定义🚀🚀🚀。Vue 2 版本…...

vue-beautiful-chat避坑指南:从安装配置到WebSocket实时通信的全流程解析

Vue2实时聊天组件深度实践:从vue-beautiful-chat配置到WebSocket全链路优化 当我们需要在Vue2项目中快速实现一个专业级聊天界面时,vue-beautiful-chat组件无疑是优雅的解决方案。但许多开发者在集成WebSocket实时通信功能时,常会遇到各种&q…...