2022-06-13:golang中,[]byte和结构体如何相互转换?
2022-06-13:golang中,[]byte和结构体如何相互转换?
答案2022-06-13:
[]byte和结构体的转换的应用场景是数据解析。
代码里有两种方法,一种是内存不共用,另一种是内存共用。
[]byte转结构体严格将首地址需要是8的倍数。但代码里并没有遵守这个规则,测试后也没问题。
但有些场合需要严格遵守这个规则,否则会出现问题。
虽然这里没出现问题,但是结构体首地址最好是8的整数倍。不过很多CPU帮你解决了。MIPS会直接崩溃。
这里没出现问题,那是因为很多CPU帮你解决了。MIPS会直接崩溃。这个答案来自qq群友。我并没有去验证。
代码用golang编写。代码如下:
package main
import (
"bytes"
"encoding/binary"
"fmt"
"unsafe"
)
type T struct {
A int64
B float64
}
func main() {
if true {
fmt.Println("切片和结构体内存不共用")
// Create a struct and write it.
t := T{A: 1, B: 3.14}
buf := &bytes.Buffer{}
err := binary.Write(buf, binary.LittleEndian, t)
if err != nil {
panic(err)
}
fmt.Println(buf.Bytes())
// Read into an empty struct.
t = T{}
err = binary.Read(buf, binary.LittleEndian, &t)
if err != nil {
panic(err)
}
fmt.Printf("%x %f\r\n", t.A, t.B)
}
fmt.Println("-------------------------")
if true {
fmt.Println("切片和结构体内存共用")
t1 := T{A: 1, B: 3.14}
fmt.Println("原结构体:", t1)
sm1 := SimulatedSlice{
Addr: unsafe.Pointer(&t1),
Len: int(unsafe.Sizeof(t1)),
Cap: int(unsafe.Sizeof(t1)),
}
bytes1 := *(*[]byte)(unsafe.Pointer(&sm1))
bytes1[0] = 2
fmt.Println("修改切片,结构体变成:", t1)
fmt.Println(bytes1)
fmt.Println("")
bytes2 := []byte{1, 3, 0, 0, 0, 0, 0, 0, 0, 31, 133, 235, 81, 184, 30, 9, 64}
fmt.Println("原切片:", bytes2)
t2 := (*T)(unsafe.Pointer(&bytes2[1]))
t2.A = 4
fmt.Println("以为会有内存对齐问题,实际上没问题。修改结构体,切片变成:", bytes2)
fmt.Println(t2)
fmt.Println("地址不是8的整数倍:", uintptr(unsafe.Pointer(&bytes2[1])))
fmt.Println("地址不是8的整数倍:", uintptr(unsafe.Pointer(t2)))
fmt.Println("严格将首地址需要是8的倍数。")
fmt.Println("一般也没事。")
fmt.Println("但有些场合需要严格遵守这个规则,否则会出现问题。")
fmt.Println("虽然这里没出现问题,但是结构体首地址最好是8的整数倍。不过很多CPU帮你解决了。MIPS会直接崩溃。")
fmt.Println("这里没出现问题,那是因为很多CPU帮你解决了。MIPS会直接崩溃。这个答案来自qq群友。我并没有去验证。")
}
}
type SimulatedSlice struct {
Addr unsafe.Pointer
Len int
Cap int
}
执行结果如下:

2022-06-13:golang中,[]byte和结构体如何相互转换?的更多相关文章
- GO学习-(13) Go语言基础之结构体
Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...
- C语言中 指针与结构体
就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址.与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型. 1 2 3 4 5 6 7 8 9 10 11 12 ...
- MFC中的NMHDR结构体和NMUPDOWN结构体
建立spin控件,创建UDN_DELTAPOS一个消息函数后: void CSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) { NM ...
- C语言中 不定义结构体变量求成员大小
所谓的求成员大小, 是求成员在该结构体中 用 sizeof(结构体名.结构体成员名) 求来的. 很多时候我们需要知道一个结构体成员中的某个成员的大小, 但是我们又不需要定义该结构体类型的变量(定义的话 ...
- 剔除list中相同的结构体数据
剔除list中相同的结构体数据,有三个思路:1.两层循环,逐个比较 2.使用set容器来剔除 3.使用unique方法去重 // deduplication.cpp : 定义控制台应用程序的入口点. ...
- Golang通过反射获取结构体的标签
Golang通过反射获取结构体的标签 例子: package main import ( "fmt" "reflect" ) type resume struc ...
- 如何系统学习C 语言(中)之 结构体篇
1,结构体 在前面我们知道变量和数组都可以用来存储数据,变量用来存储单个数据,数组可以用来存储一组同类型的数据,但你有没有发现--它们都只适合单一属性的数据.那现实生活中,很多对象都是具有多属性的.例 ...
- golang 使用reflect反射结构体
"反射结构体"是指在程序执行时,遍历结构体中的字段以及方法. 1.反射结构体 下面使用一个简单的例子说明如何反射结构体. 定义一个结构体,包括3个字段,以及一个方法. 通过refl ...
- stm32 中库函数、结构体、地址的强制类型转换、相应特殊功能寄存器之间的关系
以一个挂接在APB2上的外设函数使能为例 A : RCC_APB2PeriphClockCmd():时钟使能函数 1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFI ...
- 【2016-08-18】转载:总结C++中几种结构体初始化的方法
作者:Ac_Von 博客地址:http://www.cnblogs.com/vongang/ 文章地址:http://www.cnblogs.com/vongang/archive/2011/07/3 ...
随机推荐
- Java下变量大小写驼峰、大小写下划线、大小写连线转换
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artif ...
- scala apply方法和update方法
示例代码1 class TestApplyClass { def apply(param: String): String = { println("apply method called, ...
- [rk3568][buildroot] 移除RK3568 iodomain check
1. 问题背景 RK3568 基线代码默认会起一个服务监控RK3568 iodomain,该服务间隔性输出log信息: 由于该功能非必要,故选择移除该部分逻辑 2.解决方案 查看源码编译脚本,如下图所 ...
- Java-10接口与抽象类
Java-10接口与抽象类 抽象方法 abstract method机制 这是一个不完整的方法,它只有一个声明,没有方法体 abstract void f(); 包含抽象方法的类被称为抽象类:如果一个 ...
- Python学习笔记--数据输出
数据输出 输出为Python对象 collect算子 具体实现: reduce算子 具体实现: take算子 具体实现: count算子 具体实现: 输出到文件中 saveAsTextFile算子 具 ...
- 关于Spring注解的基础详解(补充上次并不清楚的内容)
注解,需要在.xml文件里面加这么一句话:<context:component-scan base-package=""/>(组件) Component注解 主要用于接 ...
- solidity中的mapping
mapping可以理解为python中对字典的键值遍历,键是唯一的而值是可以重复的 mapping函数的构造: mapping(_KeyType => _ValueType) mapping ...
- 用 Go 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分. 示例: 输入:nums = [1,2,3,4]输出:[1,3,2,4] 注:[3,1, ...
- [SpringBoot]Spring Boot Framework @ Environment / ApplicationContext & SpringApplication
[#]: 表示较为重要 1 Spring Boot Overview SpringBoot是一个快速开发框架,快速的将一些常用的第三方依赖整合(原理:通过Maven子父工程的方式),简化XML配置,全 ...
- 【FINALE】NOIP2022 退役记 || THE END.
我的停课生活相册 - password:1007 目录 Day -4 Day -2 Day -1 Day 1 2022/11/26 NOIP 2022 OI 浅忆录 Day -4 好冷啊.有了那么点冬 ...