Golang struct 结构体注意事项和使用细节

这篇具有很好参考价值的文章主要介绍了Golang struct 结构体注意事项和使用细节。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

结构体所有字段在内存当中是连续的


Golang struct 结构体注意事项和使用细节,Go  面向对象编程结构体 struct,golang

type Point struct {
	x, y int
}

type Rect struct {
	left, up Point
}

func main() {
	r := Rect{
		left: Point{
			x: 16,
			y: 18,
		},
		up: Point{
			x: 19,
			y: 20,
		},
	}
	fmt.Printf("%p,%p \n", &r.left, &r.up)
	fmt.Printf("%p,%p,%p,%p", &r.left.x, &r.left.y, &r.up.x, &r.left.y)
}

0xc0000141a0,0xc0000141b0
0xc0000141a0,0xc0000141a8,0xc0000141b0,0xc0000141a8

 一个int类型刚好8个字节。可以看到结构体的字段在内存当中是连续分布的,通过地址的加减来找到对应的数据。

可以看到指针的地址也是连续的,r有两个*point类型,这个两个*Point类型的本身地址也是连续的,但是他们指向的地址不一定是连续。

结构体转换


结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(字段、个数和类型) 

type A struct{
    Num int
}

type B struct{
    Num int
}

func main(){
    var a A
    var b B
    b=B(a)//这里正确吗?
}

字段名称,字段类型,字段个数都得一致才可以转。 

Golang struct 结构体注意事项和使用细节,Go  面向对象编程结构体 struct,golang

tag 结构体标签 结构体序列化


Golang struct 结构体注意事项和使用细节,Go  面向对象编程结构体 struct,golang

Golang struct 结构体注意事项和使用细节,Go  面向对象编程结构体 struct,golang

结构体字段是大写的,这样是为了能够在别的包中使用。

序列化的概念就是将一个变量序列化为字符串然后再返回给客户端。这个字符串有个通用的格式就是json,别人返回字段并不希望是大写的,更加希望返回的json字段是小写的。

这个时候就可以给结构体加上tag,在tag里面可以指定小写的字段。这样不仅仅可以在其他包中访问你的字段,并且可以将你大写的字段名改为希望的字段名称。

在使用json包的Marshal方法的时候,相当于在别的包,也就是在别的包里面访问结构体变量了。如果你的结构体变量是小写的,那么根据作用域的原则,那么在json的Marshal方法里面是访问不到这些小写的变量的,无法序列化,因此只可以大写。但是大写序列化之后的结果是大写,这样就需要使用tag。

json的Marshal函数当中使用了反射。 文章来源地址https://www.toymoban.com/news/detail-672334.html

  • 字段大写就可以序列化  
  • tag序列化后小写的字符串通过网络返回给客户端
package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name  string `json:"username"`
	Age   int    `json:"age"`
	phone string `json:"phone"`
}

func main() {
	p := &Person{
		Name:  "lucas",
		Age:   29,
		phone: "123456",
	}

	//将person序列化为json格式字符串
	if data, err := json.Marshal(p); err != nil {
		fmt.Println(err.Error())
	} else {
		fmt.Println(string(data))
	}

	d, _ := json.Marshal(p)
	var p1 Person
	json.Unmarshal(d, &p1)
	fmt.Printf("%#v", p1)

}

{"username":"lucas","age":29}
main.Person{Name:"lucas", Age:29, phone:""}

到了这里,关于Golang struct 结构体注意事项和使用细节的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 结构体的使用和结构体指针的定义注意事项

    结构体的使用和结构体指针的定义注意事项

    1、使用背景      由于想把不同地方的三个变量数据存放在一个结构体中,并且调用W25QXX_Write((u8*)p,FLASH_SIZE-100,SIZE); //从倒数第100个地址处开始,写入SIZE长度的数据。调用flash写数据函数,其参数为指针地址,于是需要定义一个结构体和指向结构体的指针,这样调用flash写函数

    2024年01月20日
    浏览(12)
  • UDP的报文结构和注意事项

    UDP的报文结构和注意事项

    UDP的报文结构如图: 画成一行会比较好理解: 主要由两部分组成:UDP报头和UDP载荷。 UDP载荷其实就是数据。 UDP报头分为四个部分,每个部分占两个字节。 源端口 目的端口 报文长度 校验和 下面介绍报头里各个部分的作用。 源端口和目的端口各占2字节 (Byte) ,端口号范围:

    2024年02月01日
    浏览(8)
  • UDP 的报文结构及注意事项

    UDP 的报文结构及注意事项

    无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接。 不可靠:即使因为网络故障等原因无法将数据报发送给接收端,UDP协议层也不会给应用层返回任何错误信息。 全双工:即可以接收数据报,也可以发送数据报 面向数据报:应用层交给UDP多长的报文,UDP原样

    2024年02月06日
    浏览(9)
  • 【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)

    【正点原子STM32】认识HAL库(CMSIS、STM32Cube固件包、HAL库框架结构、使用HAL库、注意事项)

    一、初识HAL库 1.1、CMSIS简介 1.2、HAL库简介 二、STM32Cube固件包浅析 2.1、如何获取STM32Cube固件包? 2.2、STM32Cube固件包文件夹简介 2.3、CMSIS文件夹关键文件 三、HAL库框架结构 3.1、HAL库文件夹结构 3.2、HAL库文件介绍 3.3、HAL库API函数和变量命名规则 四、如何使用HAL库 4.1、基于CM

    2024年02月21日
    浏览(15)
  • 【08】STM32·HAL库开发-HAL库介绍 | STM32Cube固件库介绍 | HAL库框架结构 | 如何使用HAL库及使用注意事项

    【08】STM32·HAL库开发-HAL库介绍 | STM32Cube固件库介绍 | HAL库框架结构 | 如何使用HAL库及使用注意事项

      CMSIS (微控制器 软件接口标准 ):Cortex Microcontroller Software Interface Standard,是由ARM和与其合作的芯片厂商( 比如ST、NXP公司等 )、软件工具厂商( Keil、IAR公司等 ),共同制定的标准。 如果没有此标准,ARM公司的产品兼容性非常差。   下图中分为三层,第一层是用户层

    2024年02月11日
    浏览(11)
  • 学习Linux的注意事项(使用经验;目录作用;服务器注意事项)

    学习Linux的注意事项(使用经验;目录作用;服务器注意事项)

    本篇分享学习Linux过程中的一些经验 Linux严格区分大小写 Linux中所有内容以文件形式保存 ,包括硬件,Linux是以管理文件的方式操作硬件 硬盘文件是 /dev/sd[a-p] 光盘文件是 /dev/sr0 等 对于设置需要写入文件,命令行的设置在重启之后就会失效,只有下入文件才可以保存下来 文

    2024年02月11日
    浏览(19)
  • grpc流式使用和注意事项

    流式grpc Server-side streaming RPC:服务器端流式 RPC Client-side streaming RPC:客户端流式 RPC Bidirectional streaming RPC:双向流式 RPC 客户端代码 服务端代码 验证 分析 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eRmLdnpt-1622633151060)(readme.assets/image-202105271114

    2023年04月10日
    浏览(13)
  • 6 使用强制类型转换的注意事项

    概述         在C语言中,强制类型转换是通过直接转换为特定类型的方式来实现的,类似于下面的代码。         这种方式可以在任意两个类型间进行转换,太过随意和武断,很容易带来一些难以发现的隐患和问题。C++为了向下兼容,保留了这种方式,但新增了四个

    2023年04月08日
    浏览(7)
  • Unity之Addressable使用注意事项

    Unity之Addressable使用注意事项

    Profile文件中配置资源构建路径和资源首次加载路径,资源如何设置了缓存,在首次加载之后会将再用缓存在缓存目录,后面将直接从缓存目录中读取,方便项目发包时候进行使用 AddressableAssetSettings文件 DisableCatalogUpdateOnStartup 勾选改选项,禁止自动更新,项目资源下载一般需

    2024年02月08日
    浏览(12)
  • 第一次使用git注意事项

    第一次使用git注意事项

    一、git 第一次使用配置 配置用户名和邮箱 git config --global user.name “用户名” git config --global user.email “邮箱” 查看用户名和邮箱 git config user.name 显示:用户名 输入 git config user.email 显示用户邮箱 查看是否生成过SSH Key(密钥) 输入:cd ~/.ssh 输入:ls 输出 如果没有id_rsa 和 id

    2024年02月07日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包