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. 【netcore基础】MVC API接口权限控制Attribute

    效果: 通过Attribute来简单控制某个方法的访问权限 例如: 下面api只能角色id是[001,002,999]的登录用户才能访问 /// <summary> /// 管理用户列表 ...

  2. 【netcore基础】MVC API全局异常捕捉中间件ExceptionHandlerMiddleWare

    项目中想通过统一的接口格式返回异常信息,而不是404 500等HTTP协议层的异常响应 例如 { , , "message":"用户名或密码不正确", &quo ...

  3. MySQL 出现You can't specify target table for update in FROM clause错误解决方法

    MySQL出现You can’t specify target table for update in FROM clause 这个错误的意思是不能在同一个sql语句中,先select同一个表的某些值 ...

  4. WCF中序列化(XML\JSON\Dt)

    序列化 是将对象转换为容易传输的格式的过程.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象. 序列化描述了持久化 ...

  5. E - TOYS

    来源 poj 2318 Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad ...

  6. poj1094 Sorting It All Out【floyd】【传递闭包】【拓扑序】

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:39731   Accepted: 139 ...

  7. Kindle Paper White 使用感受视频上线啦!

    大家可以通过以下链接前往我的主页观看视频哦! https://www.youtube.com/watch?v=CESqzxTrAq4&t=322s 欢迎大家点赞.关注! 这期视频用iPhone ...

  8. Linux之文档与目录结构 目录的相关操作 Linux的文件系统

    Linux之文档与目录结构   Linux文件系统结构 Linux目录结构的组织形式和Windows有很大的不同.首先Linux没有“盘(C盘.D盘.E盘)”的概念.已经建立文件系统的硬盘分区被挂载到 ...

  9. IAR 路径导致的错误

    Error while running "c:\ti\simplelink_cc2640r2_sdk_1_50_00_58\..\xdctools_3_50_03_33_core\xs&qu ...

  10. json解析出来数据为空解决方法

    从APP端或从其他页面post,get过来的数据一般因为数组形式.因为数组形式不易传输,所以一般都会转json后再发送.本以为发送方json_encode(),接收方json_decode(),就解决 ...