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 ...
随机推荐
- mkvirtualenv command not found解决
在京东云上用户家目录下创建.virtualenvs后,创建python虚拟环境,使用mkvirtualenv命令,没有提示,输完回车报下面错误,mkvirtualenv command not fou ...
- Visual Studio(C#)快捷键与Eclipse(JAVA)快捷键对比
Visual Studio与Eclipse快捷键对比 Visual Studio Eclipse 代码提示: Ctrl+J Ctrl+空格键 / Alt+/ .abcdefghijklmnopqr ...
- Django之Web框架本质及第一个Django实例
Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...
- Maven -DskipTests和-Dmaven.test.skip=true的区别
在使用mvn package进行编译.打包时,Maven会执行src/test/java中的JUnit测试用例,有时为了跳过测试,会使用参数-DskipTests和-Dmaven.test.skip= ...
- elasticsearch.yml配置文件
Elasticsearch的配置文件在config文件夹下,其中有elasticsearch.yml.logging.yml两个配置文件,其中elasticsearch.yml是用来配置Ela ...
- xcode reset 删除重新安装
Type "rm -rf ~/Library/Application Support/Xcode" and press "Enter." This remove ...
- MSSQL数据库优化经验
数据库优化的目标无非是避免磁盘I/O瓶颈.减少CPU利用率和减少资源竞争.1. 在业务密集的SQL当中尽量不采用IN操作符2. 不使用not in 因为它不能应用表的索引.用not exists 或 ...
- xcode工程编译错误:error: Couldn’t materialize
错误信息: error: Couldn't materialize: couldn't get the value of variable amount: variable not available ...
- innodb表锁情况
MySQL InnoDB默认行级锁.行级锁都是基于索引的 行级锁变为表级锁情况如下: 1.如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁把整张表锁住. 2.表字段进行变更. 3.进行整表 ...
- u-boot 编译,启动流程分析,移植
分析u-boot-1.1.6 的启动流程 移植u-boot 2012.04版本到JZ2440开发板 源码百度云链接:https://pan.baidu.com/s/10VnxfDWBqJVGY3SCY ...