如何在Golang中转换指针类型

huangapple go评论109阅读模式
英文:

How can I convert pointer type in golang

问题

我想将类似于(*float32)的内容转换为(*int32)。

我这样做:

  1. var f float32 = 0.0
  2. var p *int32 = (*int32)(&f) // 错误!
  3. // 无法将 &f (类型为 *float32) 转换为 *int32

我应该如何像在C语言中那样完成这个操作:

  1. float f = 0.0;
  2. int *ip = (int*) &fp;
英文:

I want convert something like (*float32) to (*int32)

I do this

  1. var f float32 = 0.0
  2. var p *int32 = (*int32)(&f) // error!
  3. // cannot convert &f (type *float32) to type *int32

How can I do this like what I'm done in C

  1. float f = 0.0;
  2. int *ip = (*int) &fp;

答案1

得分: 17

你绝对可以用Go语言来完成这个任务。有两种方法,一种是安全的,一种是不安全的:

  1. package main
  2. import (
  3. "encoding/binary"
  4. "fmt"
  5. "math"
  6. "unsafe"
  7. )
  8. func main() {
  9. var f float32
  10. var i int32
  11. // 不安全的方法
  12. f = 1.234
  13. i = *((*int32)(unsafe.Pointer(&f)))
  14. fmt.Println(f, i)
  15. // 安全的方法
  16. var tmp [4]byte
  17. f = 1.234
  18. binary.LittleEndian.PutUint32(tmp[:], math.Float32bits(f))
  19. i = int32(binary.LittleEndian.Uint32(tmp[:]))
  20. fmt.Println(f, i)
  21. }

希望对你有帮助!

英文:

You absolutely can do this in Go. There are two ways. One safe and one unsafe:

  1. package main
  2. import (
  3. "encoding/binary"
  4. "fmt"
  5. "math"
  6. "unsafe"
  7. )
  8. func main() {
  9. var f float32
  10. var i int32
  11. // unsafe
  12. f = 1.234
  13. i = *((*int32)(unsafe.Pointer(&f)))
  14. fmt.Println(f, i)
  15. // safe
  16. var tmp [4]byte
  17. f = 1.234
  18. binary.LittleEndian.PutUint32(tmp[:], math.Float32bits(f))
  19. i = int32(binary.LittleEndian.Uint32(tmp[:]))
  20. fmt.Println(f, i)
  21. }

huangapple
  • 本文由 发表于 2016年12月19日 18:31:28
  • 转载请务必保留本文链接:https://go.coder-hub.com/41220586.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定