2016-12-19 2 views
1

ich konvertieren wollen so etwas wie (* float32) bis (* int32)Wie kann ich Zeigertyp in golang

ich tun, um diese

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

konvertieren Wie kann ich das, was ich bin fertig in C

float f = 0.0; 
int *ip = (*int) &fp; 
+0

Sie nicht diese in Go tun können, als Go nicht C ist – Volker

+1

Ich glaube nicht, Ihre C-Code funktioniert. Es wird einfach ein Pointer auf einen float in einen Zeiger auf einen int geworfen, was bedeutet, dass Sie die Laufzeit in die Irre führen, da an dieser Adresse ein int gespeichert ist (ints und floats haben sehr unterschiedliche binäre Formate). Go verhindern, dass Sie diese Art von Fehler machen (trotz der Unterstützung des Konzepts des Zeigers). –

+0

Möchten Sie _really_ möchten, dass der Gleitkommawert direkt als int gelesen wird, oder versuchen Sie, den float32-Wert in einen int32-Wert zu konvertieren? – JimB

Antwort

5

Sie können dies in Go absolut tun. Es gibt zwei Möglichkeiten. Eine sichere und eine unsichere:

package main 

import (
    "encoding/binary" 
    "fmt" 
    "math" 
    "unsafe" 
) 

func main() { 
    var f float32 
    var i int32 

    // unsafe 
    f = 1.234 
    i = *((*int32)(unsafe.Pointer(&f))) 
    fmt.Println(f, i) 

    // safe 
    var tmp [4]byte 
    f = 1.234 
    binary.LittleEndian.PutUint32(tmp[:], math.Float32bits(f)) 
    i = int32(binary.LittleEndian.Uint32(tmp[:])) 
    fmt.Println(f, i) 
} 
+0

Wirklich danke Ihrer Hilfe, um mein Problem zu lösen. – Kiochan

Verwandte Themen