2017-11-05 6 views
1

Goで説明できない互換性のないタイプのため、コンパイルエラーが発生しました。私は"C"モジュールを使用しています。これは、メッセージ ./main.go:12: cannot use x (type C.int) as type module.C.int in field valueでコンパイルに失敗しGo Cタイプが異なるモジュールから来た場合、なぜ異なるのですか?

package module 

import "C" 

type T struct { 
    X C.int 
} 

とメインプログラム

package main 

import (
    "fmt" 
    "sandbox/module" 
) 

import "C" 

func f() *module.T { 
    var x C.int = 42 
    return &module.T{X: x} 
} 

func main() { 
    fmt.Printf("value: %d", f().X) 
} 

:最小の例は、以下の2つのファイルで構成されています。

コンパイラは何らかの理由でC.intmodule.C.intと等しくないと考えます。

それはCモジュールと私はC.intからプレーンintに切り替えた場合、それが突然動作するためのコードが2つのモジュールに分散しているという事実とは何かを持っている必要があります。

なぜこのコードはコンパイルされませんか? 1つのモジュールですべてのコードを一括してコンパイルせずにコンパイルするための適切なソリューションは何でしょうか?

私はUbuntu 16.04で最新のGoコンパイラ1.9.2を使用しています。

答えて

2

Command cgo

Go references to C

CGOは、同等のアンエクスポート囲碁種類にC型を変換します。 翻訳がエクスポートされていないため、GoパッケージはエクスポートされたAPIにC タイプを公開しないでください。Goパッケージで使用されるCタイプは で、別のタイプのCタイプと異なります。

「何らかの理由で、コンパイラがC.intがmodule.C.intと等しくないと思っています。 cgoコマンドのドキュメントで説明されているように、異なるパッケージの非公開Go型は等しくありません。

エクスポートされたAPIでCタイプを公開しないでください。例えば、

module.go

package module 

type T struct { 
    X int 
} 

main.go

package main 

import (
    "fmt" 
    "sandbox/module" 
) 

import "C" 

func f() *module.T { 
    var x C.int = 42 
    return &module.T{X: int(x)} 
} 

func main() { 
    fmt.Printf("value: %d\n", f().X) 
} 

出力:

value: 42 
関連する問題