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和结构体如何相互转换?的更多相关文章

  1. GO学习-(13) Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...

  2. C语言中 指针与结构体

    就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址.与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型. 1 2 3 4 5 6 7 8 9 10 11 12 ...

  3. MFC中的NMHDR结构体和NMUPDOWN结构体

    建立spin控件,创建UDN_DELTAPOS一个消息函数后: void CSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) { NM ...

  4. C语言中 不定义结构体变量求成员大小

    所谓的求成员大小, 是求成员在该结构体中 用 sizeof(结构体名.结构体成员名) 求来的. 很多时候我们需要知道一个结构体成员中的某个成员的大小, 但是我们又不需要定义该结构体类型的变量(定义的话 ...

  5. 剔除list中相同的结构体数据

    剔除list中相同的结构体数据,有三个思路:1.两层循环,逐个比较 2.使用set容器来剔除 3.使用unique方法去重 // deduplication.cpp : 定义控制台应用程序的入口点. ...

  6. Golang通过反射获取结构体的标签

    Golang通过反射获取结构体的标签 例子: package main import ( "fmt" "reflect" ) type resume struc ...

  7. 如何系统学习C 语言(中)之 结构体篇

    1,结构体 在前面我们知道变量和数组都可以用来存储数据,变量用来存储单个数据,数组可以用来存储一组同类型的数据,但你有没有发现--它们都只适合单一属性的数据.那现实生活中,很多对象都是具有多属性的.例 ...

  8. golang 使用reflect反射结构体

    "反射结构体"是指在程序执行时,遍历结构体中的字段以及方法. 1.反射结构体 下面使用一个简单的例子说明如何反射结构体. 定义一个结构体,包括3个字段,以及一个方法. 通过refl ...

  9. stm32 中库函数、结构体、地址的强制类型转换、相应特殊功能寄存器之间的关系

    以一个挂接在APB2上的外设函数使能为例 A : RCC_APB2PeriphClockCmd():时钟使能函数 1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFI ...

  10. 【2016-08-18】转载:总结C++中几种结构体初始化的方法

    作者:Ac_Von 博客地址:http://www.cnblogs.com/vongang/ 文章地址:http://www.cnblogs.com/vongang/archive/2011/07/3 ...

随机推荐

  1. python之pyqt5-第一个pyqt5程序-图像压缩工具(2.0版本)-小记

    (如想转载,请联系博主或贴上本博地址) 此篇为上一篇pyqt5图像压缩小工具改良版.因为比较简单,下面直接贴上代码. 效果图: # -*- coding: utf-8 -*- # Form imple ...

  2. Spring源码分析之注册BeanDefinition

    测试代码 public class ContextApplication { public static void main(String[] args) { ClassPathXmlApplicat ...

  3. MySQL学习(一)大纲

    1.逻辑架构 参考博客:https://blog.csdn.net/fuzhongmin05/article/details/70904190 最上层为客户端层,并非mysql独有,诸如:连接处理.授 ...

  4. Linux系统下祼机安装mysql8.0和docker mysql 8.0 性能差异对比~

    环境准备 准备两台服务器环境,配置相同,分别安装Centos7,mysql8.0,docker mysql 8.0 准备测试代码 public class Chat { public static l ...

  5. 给生活加点惊喜,做创意生活的原型设计师丨编程挑战赛 x 选手分享

    前言 做产品的大都跳过一个坑:我有了一个很好的产品创意,只差一个程序员帮我实现编程了. 事实上从产品创意到落地上线,中间需要经过非常复杂的过程,细节的逻辑流程才是难点,创意不能落地,并不值钱. 本文作 ...

  6. 在java中new一个对象的流程是什么?

    Dog dog=new Dog()背后执行过程 这个涉及到字节码文件结构,类加载机制,堆,栈的认识等知识点. 在执行new的时候可以大致分为二个过程,初始化以及实例化,初始化就是类的加载过程,首先我们 ...

  7. 简单入门echart方法

    图表用echart, 然后前端的 HTML 跟 nodejs  , nodejs 去调用 后端PHP的接口 链接:https://www.jianshu.com/p/1f2c37c5c02f 官网:h ...

  8. Java 8 中需要知道的4个函数式接口-Function、Consumer、Supplier、Predicate

    前言 Java 8 中提供了许多函数式接口,包括Function.Consumer.Supplier.Predicate 等等.这 4 个接口就是本篇将要分享的内容,它们都位于 java.util.f ...

  9. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(13)-Charles如何进行Mock和接口测试

    1.简介 Charles最大的优势在于抓包分析,而且我们大部分使用的功能也在抓包的功能上,但是不要忘记了,Charles也可以做接口测试.至于Mock,其实在修改请求和响应数据哪里就已经介绍了,宏哥就 ...

  10. [Git]Git统计代码行数

    1 前言 今天,有这么一个需求:小组老大要求咱们[每个人]把[上个月]的[代码行数]统计一下并上报. 成,统计就统计,但那么多项目,总不能让我用手去数吧?何况,时间久了,自己也不清楚自己改了哪些地方了 ...