2016-04-07 13 views
0
import "C" 

func f() { 
    var vGo int 
    var vC C.int 
    // fails to compile with error 
    // cannot use &vGo (type *int) as type *C.int in argument to... 
    C.c_function(&vGo) 
    // compiles just fine: 
    C.c_function(&vC) 
} 

I mit CGO_ENABLED = 1 GOARCH = Arm kompilieren ...Was ist der Unterschied zwischen int und C.int in go?

Was in diesem Fall in int und C.int Typen die anders?
Wo finde ich zusätzliche Informationen zu C-Typen in GO?

Antwort

2

Was ist der Unterschied zwischen den Typen? Es kommt darauf an. Wenn Sie 64 Bit verwenden, ist der Go Int 64 Bit, während der C Int 32 ist. Wenn Sie auf 32 Bit sind, gibt es keinen wirklichen Unterschied.

Wo finde ich zusätzliche Informationen zu C-Typen in Go? Sehen Sie sich die Dokumentation für C an. Wie in den Kommentaren erwähnt, sind implizite numerische Typumwandlungen in Go nicht zulässig, sodass eine Konvertierung erforderlich ist.

+1

Sorry, aber der zweite Teil ist nicht korrekt. Go 'int' kann abhängig von der Architektur entweder 64 oder 32 Bit sein. https://golang.org/ref/spec#Numeric_types – jupp0r

+0

@ jupp0r ja, ich habe versucht, das mit "wenn du auf 64bit bist" zu vermitteln, obwohl meine Sprache vielleicht nicht spezifisch genug war. – evanmcdonnal

+0

Der relevante Unterschied ist nicht, dass sie 32 oder 64 Bits sind, sondern dass sie verschiedene Typen sind und Go keine impliziten numerischen Typumwandlungen erlaubt. Sie erhalten den gleichen Fehler unabhängig davon, ob die Typen die gleiche Größe haben oder nicht. – JimB

1

Go bewusst nicht implizite Typumwandlung nicht unterstützt, mit einigen Ausnahmen 1:

Ein Wert x ist zuordenbar einer Variablen des Typs T (x „zuordenbar T“) in jedem dieser Fälle:

  • xs Typ ist identisch mit T.
  • xs Typ V und T identisch zugrunde liegenden Typen und mindestens einer von V oder T ist kein genannten Art.
  • T ist ein Schnittstellentyp und x implementiert T
  • x ist ein bidirektionaler Kanalwert, T ist ein Kanaltyp, x Typ V und T haben identische Elementtypen und mindestens einer von V oder T ist nicht a benannter Typ.
  • x ist der vordeklarierte Bezeichner nil und T ist ein Zeiger, eine Funktion, ein Schnitt, eine Karte, ein Kanal oder ein Schnittstellentyp.
  • x ein nicht typisierte Konstante darstellbare durch einen Wert vom Typ T

Die Umwandlung in Ihrem Fall benötigt wird, möglicherweise Layouts unterschiedliche Speicher 2 anzupassen.

Verwandte Themen