GoLang 强制类型转换:unsafe.Pointer
来源:互联网 发布:linux视频教程韩顺平 编辑:程序博客网 时间:2024/06/15 09:18
注意此种转换只适合简单类型,对于有对象描述的类型是完全不适用的,鸡肋啊
ps:补充另外一种用法,这次就不鸡肋了
Go语言是个强类型语言。也就是说Go对类型要求严格,不同类型不能进行赋值操作。指针也是具有明确类型的对象,进行严格类型检查。下面的代码会产生编译错误
01
package main
02
03
import (
04
"fmt"
05
)
06
07
func main() {
08
u := uint32(32)
09
i := int32(1)
10
fmt.Println(&u, &i)
// 打印出地址
11
p := &i
// p 的类型是 *int32
12
p = &u
// &u的类型是 *uint32,于 p 的类型不同,不能赋值
13
p = (*int32)(&u)
// 这种类型转换语法也是无效的
14
fmt.Println(p)
15
}
01
package main
02
03
import (
04
"fmt"
05
"unsafe"
06
)
07
08
func main() {
09
u := uint32(32)
10
i := int32(1)
11
fmt.Println(&u, &i)
12
p := &i
13
p = (*int32)(&u)
14
p = (*int32)(unsafe.Pointer(&u))
15
fmt.Println(p)
16
}
补充:实际使用中unsafe可用场景很少,稍微复杂一点的结构,比如struct,unsafe根本不能适用,正确的方法还是要靠 type assertion
ps:发现一种用法,看代码
01
package main
02
03
import (
04
"fmt"
05
"text/template"
06
"unsafe"
07
)
08
// MyTemplate 定义和 template.Template 只是形似
09
type MyTemplate
struct
{
10
name string
11
parseTree *unsafe.Pointer
12
common *unsafe.Pointer
13
leftDelim string
14
rightDelim string
15
}
16
17
func main() {
18
t :=
template
.New(
"Foo"
)
19
p := (*My<span></span>Template<span></span>)(unsafe.Pointer(t))
20
p.name =
"Bar"
// 关键在这里,突破私有成员
21
fmt.Println(p, t)
22
}
(转自:http://my.oschina.net/achun/blog/122540) 0 0
- GoLang 强制类型转换:unsafe.Pointer
- 关于强制类型转换:强制类型转换
- 类型转换&&类型强制转换
- 类型转换&&类型强制转换
- Golang 类型转换整理
- Golang 类型转换整理
- golang 断言 + 类型转换
- golang 类型转换
- Golang类型转换
- golang类型转换
- 类型转换(向下强制)
- c++强制类型转换
- 强制类型转换
- 关于强制类型转换
- c++强制转换类型
- C++ 强制类型转换
- c++强制类型转换
- 强制类型转换
- Json和xml的优缺点
- C++ 内存分配、堆栈!
- 使用SQL语句清空数据库所有表的数据
- 西红柿
- 中国古代神兽大全
- GoLang 强制类型转换:unsafe.Pointer
- 番茄2
- my vim config
- mvn相关介绍和命令
- 番茄3
- Stanford机器学习---第六讲. 怎样选择机器学习方法、系统
- 中断_中断下半部的一些分析
- 番茄4
- Crawler学习:4.Improve Performance