4

私はGolangのドキュメントを調べましたが、私がやろうとしていることを達成する方法の例を見ていません。syscall.Stat_t.Ino具体的には、マシン上でタイプを持つinodeからuint64、次のように定義されたino_entryへのマップを書き込もうとしています。

type ino_entry struct {
    st    *syscall.Stat_t
    nodes []string
}

ここで、nodesは、iノードにハードリンクされているすべてのファイルの名前を表します。

uint64ただし、可能であれば、マップの仕様にリテラル型を含めないようにします。つまり、を書く代わりに、map [uint64] ino_entryを書くほうがいいmap [typeof(syscall.Stat_t.Ino)] ino_entryです。ここで、typeof(x)は静的(つまりコンパイル時)タイプのを返しますxmap [syscall.Stat_t.Ino] ino_entryタイプスイッチとの類推で試してみましmap [syscall.Stat_t.Ino.(type)] ino_entryたが、どちらも構文エラーです。言うまでもなく、map [reflect.Typeof(syscall.Stat_t.Ino)] ino_entry動作しません。私の知る限り、構造体要素の型をハードコーディングせずにこれを実装する唯一の方法は、inomap := make(map [interface{}] ino_entry)型アサーションを使用して要素にアクセスすることです(ただし、これの正しい構文はわかりません)。

別の変数の静的型、または構造体またはインターフェイスメンバーに基づいて、その型を明示的にハードコーディングせずに変数の型を宣言する方法はありますか?

4

3 に答える 3

2

マシンの移植性を確保するためにReflectionを使用しようとしているようです。その場合は、使用できるより優れたツールがあります。

go buildarchとosに基づくビルドの条件付きファイルインクルードを処理できます。

したがって、サポートするarchとosの組み合わせごとにいくつかのファイルを作成します。各ファイルの上部に、いくつかのビルド制約を追加します。

// +build linux,386たとえば、goコマンドは386アーチのLinuxマシンでのみこのファイルを使用します。

次に、そのファイルに、そのアーチに適合するタイプのタイプエイリアスを追加します。type Ino uint64

最後に、マップをとして作成しますmap[Ino]ino_entry

ワラ!goのタイプエイリアシングと条件付きファイルインクルードを使用したマシンの移植性。

goのビルド制約について詳しくは、http://golang.org/pkg/go/build/をご覧ください。

于 2013-01-07T19:51:50.143 に答える
0

参照。OPの最後の質問:はい、式の型をハードコピーせずに、式の型に基づいて変数の型を宣言する方法があります:

v := expr // equal to var v typeof(expr); v = expr;

exprまた、あなたが言及したほとんどのエンティティ、つまり別の変数、構造体型の「もの」が含まれますが、インターフェースメンバーは含まれません(仕様でこれまでに言及されたもののメンバーがないため)

残念ながら、これはマップ型の宣言とは関係ありません。使用される型リテラルmap[T]Uが. ここでは、上で説明した短い変数宣言の場合のように、と の両方T推論U することはできません

于 2013-01-07T06:59:44.557 に答える
0

Stat_tはどのマシンでも同じ定義Inoを持ち、そのフィールドは常にuint64であるため、ここでは問題になりません。

この型を静的に取得するコンパイル時演算子がある場合は、適切に隠されている必要があります。

ただし、タイプ alias: を定義することもできますtype ino_id uint64。これは、私にとってより読みやすいように見えます。

于 2013-01-07T06:59:53.093 に答える