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的更多相关文章

  1. CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中

    CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-10-28. 编写了个golang程序,用到了这个C ...

  2. 聊聊 C 语言中的 sizeof 运算

    聊聊 sizeof 运算 在这两次的课上,同学们已经学到了数组了.下面几节课,应该就会学习到指针.这个速度的确是很快的. 对于同学们来说,暂时应该也有些概念理解起来可能会比较的吃力. 先说一个概念叫内 ...

  3. C++面试中关于sizeof问题总结

    原文:http://blog.sina.com.cn/s/blog_7c983ca60100yfdv.html#SinaEditor_Temp_FontName (1)      sizeof是操作符 ...

  4. memset中的sizeof

    记录memset中的sizeof的用法, unsigned char *buff = (unsigned char*) malloc(128 * sizeof(char)); //错误的:memset ...

  5. golang学习笔记19 用Golang实现以太坊代币转账

    golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...

  6. 交互式编程之Golang基本配置(Jupyter-notebooks Golang)

    JupyterNoteBook-GO 启动错误 Install Go Install gophernotes 参考资料 如有错误,欢迎指出 错误 error: Cannot assign reques ...

  7. C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,

    //将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...

  8. 从数组A中删除在数组B中存在的元素,用C语言实现

    从数组A中删除在数组B中存在的元素,用C语言实现 考验数组操作的能力,C语言的熟练程度. //功能:从数组A中删除在数组B中也存在的数据 //输入:arrA --- 数组A // lenA --- 数 ...

  9. Redis 中的原子操作(1)-Redis 中命令的原子性

    Redis 如何应对并发访问 Redis 中处理并发的方案 原子性 Redis 的编程模型 Unix 中的 I/O 模型 thread-based architecture(基于线程的架构) even ...

随机推荐

  1. Python实现C代码统计工具(三)

    目录 Python实现C代码统计工具(三) 声明 一. 性能分析 1.1 分析单条语句 1.2 分析代码片段 1.3 分析整个模块 二. 制作exe Python实现C代码统计工具(三) 标签: Py ...

  2. Android Studio开发第二篇创建新项目

    创建新项目很简单,File-New-New Project,这个没什么好说的跟Eclipse都差不都. 第二步SDK选择,有手机平板还有Wear,TV,汽车Auto,谷歌眼镜等几个种平台,这里就先选择 ...

  3. element的form表单中如何一行显示多el-form-item标签

    效果图: HTML代码: <script src="//unpkg.com/vue/dist/vue.js"></script> <script sr ...

  4. autodesk fbx sdk sample里面的工程无法调试解决方法

    1.项目属性->常规中的目标文件名改为1 2.链接器->调试中的生成程序数据库文件改成:$(OutDir)1.pdb 3.连接器->常规中的输出文件改成:$(OutDir)1.exe ...

  5. python爬虫+使用cookie登录豆瓣

    2017-10-09 19:06:22 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言: 先获得cookie,然后自动登录豆瓣和新浪微博 系统环境: 64位win10系统,同时装pytho ...

  6. DB2 性能分析工具介绍:Event Monitor 篇(转)

    https://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1112qiaob/ 引言 DB2 提供了两个比较常用的数据库性能分 ...

  7. [No0000114]远程桌面剪贴板无法同步本机,无法复制粘贴问题解决

    远程桌面无法与桌面共享复制内容(远程桌面复制之后,无法在本地桌面粘贴.反之亦然.),这时候需要杀掉一个进程并重新启动.[重启 rdpclip.exe] 1.在远程桌面中右键点击,选择启动任务管理器: ...

  8. TF模型训练中注意Loss和F1的变化情况

    之前训练模型,认为网络图构建完成,Loss肯定是呈现下降的,就没有太留心,知识关注F1的变化情况,找到最优的F1训练就停止了,认为模型就ok. 但实际中发现,我们要时刻关注网络的损失变化情况,batc ...

  9. OPTIMIZE TABLE linked list 表优化原理 链表数据结构 空间再利用

    小结: 1.加快读写: 2.对于InnoDB表,在一定条件下,通过复制旧表重建: 3.实践中, 3.1.show processlist;查看线程,发现,认为堵塞读请求: 3.2.数据长度空间不变,索 ...

  10. CHARACTER SET

    mysql> show tables; +-----------------+ | Tables_in_w0811 | +-----------------+ | t | | w_engine ...