golang 中的 sizeof 以及 golang中的 union
golang 中的 sizeof:
1:
int(unsafe.Sizeof(uint32(0)))
2:
int(reflect.TypeOf(uint32(0)).Size())
golang中的 union:
package main import (
"fmt"
"reflect"
"unsafe"
) type I struct {
a int32
} type B struct {
c []int16
} func main() {
a := I{0x060302}
b := (*B)(unsafe.Pointer(&a))
fmt.Printf("%x, %d\n", a.a, a.a)
fmt.Printf("%v\n", b.c)
fmt.Printf("%v\n", b.c[])
b.c[] = 0x0008
fmt.Printf("%v\n", b.c)
fmt.Printf("%x, %d\n", a.a, a.a)
fmt.Printf("%d\n", reflect.TypeOf(b.c).Size())
fmt.Printf("%d\n", reflect.TypeOf(a).Size())
}
注意,如果你要以 (*B)(unsafe.Pointer(&a)) 这种方式来作为 union,必须保证这两个union的类型字节大小一样大,golang不会为你检查越界。上面的例子就越界了,编译和运行时,golang没有任何警告。
下面是更完善的实现:
package main import (
"fmt"
"reflect"
"unsafe"
) // ----- union begin ---------------------------------------------------
type IorBUnion interface {
toB() *B
toI() *I
} type I struct {
a int32
} func (i *I) toB() *B {
return (*B)(unsafe.Pointer(i))
} func (i *I) toI() *I {
return i
} type B struct {
c []int16
} func (b *B) toB() *B {
return b
} func (b *B) toI() *I {
return (*I)(unsafe.Pointer(b))
} // ------- union end ------------------------------------------------- type myStruct struct {
iOrB IorBUnion
aaa int
} func main() {
a := &I{0x060302}
mystruct := myStruct{a, }
b := (*B)(unsafe.Pointer(a))
fmt.Printf("%x, %d\n", a.a, a.a)
fmt.Printf("%v\n", b.c)
fmt.Printf("%v\n", b.c[])
b.c[] = 0x0008
fmt.Printf("%v\n", b.c)
fmt.Printf("%x, %d\n", a.a, a.a)
fmt.Printf("%d\n", reflect.TypeOf(b.c).Size())
fmt.Printf("%d\n", reflect.TypeOf(a).Size())
fmt.Println(b.toB())
fmt.Println(b.toI())
fmt.Println(b.toI().toB())
fmt.Println(a.toI().toB())
fmt.Println(mystruct.iOrB.toI().toB())
}
golang 中的 sizeof 以及 golang中的 union的更多相关文章
- CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中
		CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-10-28. 编写了个golang程序,用到了这个C ... 
- 聊聊 C 语言中的 sizeof 运算
		聊聊 sizeof 运算 在这两次的课上,同学们已经学到了数组了.下面几节课,应该就会学习到指针.这个速度的确是很快的. 对于同学们来说,暂时应该也有些概念理解起来可能会比较的吃力. 先说一个概念叫内 ... 
- C++面试中关于sizeof问题总结
		原文:http://blog.sina.com.cn/s/blog_7c983ca60100yfdv.html#SinaEditor_Temp_FontName (1) sizeof是操作符 ... 
- memset中的sizeof
		记录memset中的sizeof的用法, unsigned char *buff = (unsigned char*) malloc(128 * sizeof(char)); //错误的:memset ... 
- golang学习笔记19 用Golang实现以太坊代币转账
		golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ... 
- 交互式编程之Golang基本配置(Jupyter-notebooks Golang)
		JupyterNoteBook-GO 启动错误 Install Go Install gophernotes 参考资料 如有错误,欢迎指出 错误 error: Cannot assign reques ... 
- C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,
		//将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ... 
- 从数组A中删除在数组B中存在的元素,用C语言实现
		从数组A中删除在数组B中存在的元素,用C语言实现 考验数组操作的能力,C语言的熟练程度. //功能:从数组A中删除在数组B中也存在的数据 //输入:arrA --- 数组A // lenA --- 数 ... 
- Redis 中的原子操作(1)-Redis 中命令的原子性
		Redis 如何应对并发访问 Redis 中处理并发的方案 原子性 Redis 的编程模型 Unix 中的 I/O 模型 thread-based architecture(基于线程的架构) even ... 
随机推荐
- cordova 插件 调用iOS社交化分享(ShareSDK:微信QQ分享)
			1.github上已有的插件:https://github.com/nwpuhmz/ShareSDKPlugin 2.安装插件 cordova plugin add https://github.co ... 
- 7.8CSS部分的学习!
			<!DOCTYPE html> <html> <head> <title>CSS元素选择器</title> <style type=& ... 
- day10 多媒体(文字 图片 音频 视频)
			1计算机表示图形的几种方式 bmp:以高质量保存 用于计算机 jpg:以良好的质量保存 用于计算机或者网络 png:以高质量保存 图片大小的计算公式:图片 ... 
- Android必学-异步加载+Android自定义View源码【申明:来源于网络】
			Android必学-异步加载+Android自定义View源码[申明:来源于网络] 异步加载地址:http://download.csdn.net/detail/u013792369/8867609 ... 
- Hyper-V 与 VMware 和 vbox 的不兼容
			新装的win10 开始先装到docker 装之前必须要装Hyper-V 后来装vbox 并且安装了Centos7系统也用得起,后来不知道怎么win10好像升级了.再启动vbox 开启centos7就报 ... 
- angular 表单元素的验证清除问题
			项目中利用了前些时候写的弹出dialog的方式,验证方式用了控件angular-validation(http://www.cnblogs.com/FineDay/p/7255689.html) 验证 ... 
- Vue的自动化测试
			前言 为什么我们需要测试? 让产品可以快速迭代,同时还能保持高质量 -- 阮一峰 持续集成是什么? 对于一些相对稳定的系统级别页面,自动化测试在提高测试的效率的方面起到非常重要的作用.前端的自动化测试 ... 
- python3写入csv文件时中文为乱码
			今天修改李万的爬虫时把页面上的中文写入csv文件时,中文总是乱码.通过上网搜索得到解决.解决的办法是打开文件是需加参数 encoding='utf-8-sig' .感谢博客园的菜鸟Alex.他相关博客 ... 
- opencv模板匹配有趣的链接
			https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_template_matching/py_template_matchi ... 
- <笔记>Effective Objective-C 2.0 编写高质量iOS与
			1. 内存管理-引用计数 2. 非对象类型 int float double char 3.运行时--编译器(编译时)函数调用 4.@class 缩短编译时间,降低依赖,耦合 5.使用字面量而不是 ... 
