[解決済み] 構造体のプロパティに名前でアクセスする
2023-03-18 19:05:43
質問
簡単な囲碁のプログラムが動作しません。
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
v := Vertex{1, 2}
fmt.Println(getProperty(&v, "X"))
}
func getProperty(v *Vertex, property string) (string) {
return v[property]
}
エラーです。
prog.go:18: 無効な操作: v[property] (型 *Vertex のインデックス)
私がしたいのは、その名前を使用して頂点Xのプロパティにアクセスすることです。もし私が
v.X
とすればうまくいきますが
v["X"]
は動作しません。
誰かこれを動作させる方法を教えてください。
どのように解決するのですか?
ほとんどのコードでは、この種の動的検索は必要ないはずです。直接アクセスに比べて非効率的です (コンパイラーは頂点構造体の X フィールドのオフセットを知っているので、v.X を 1 つの機械命令にコンパイルできますが、動的検索にはある種のハッシュ テーブル実装または類似のものが必要です)。コンパイラーは、未知のフィールドに動的にアクセスしようとしていないことを確認する方法がなく、結果としてどのような型になるべきかを知ることができないため、静的型付けも阻害します。
しかし...この言語では を反映します。 モジュールが用意されているので、これが必要になることは稀です。
package main
import "fmt"
import "reflect"
type Vertex struct {
X int
Y int
}
func main() {
v := Vertex{1, 2}
fmt.Println(getField(&v, "X"))
}
func getField(v *Vertex, field string) int {
r := reflect.ValueOf(v)
f := reflect.Indirect(r).FieldByName(field)
return int(f.Int())
}
ここではエラーチェックを行っていませんので、存在しないフィールドを要求したり、フィールドの型がintでない場合、パニックになります。チェック のドキュメントを参照してください。 のドキュメントを参照してください。
関連
-
[解決済み] Goで構造体のフィールドを反復処理する
-
[解決済み] 構造体変数をコンソールに表示するには?
-
[解決済み] サーバーでSSLが有効になっていない
-
[解決済み] Goで関数の名前を取得するには?
-
[解決済み] 現在時刻に時・分・秒を足す
-
[解決済み] テキストファイルを文字列配列に読み込む(そして書き込む)
-
[解決済み] Go で子プロセスの標準出力パイプをリダイレクトする
-
[解決済み] bytes.Buffer does not implement io.Writer" というエラーメッセージが表示される。
-
[解決済み] Go プログラムに渡されたコマンドライン引数にアクセスするには?
-
[解決済み] gc」と「gccgo」の主な相違点は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] reflectを使用して、構造体フィールドの値を設定するにはどうすればよいですか?
-
[解決済み] Goで関数の名前を取得するには?
-
[解決済み] Goのargv[0]に相当するものは何ですか?
-
[解決済み] Go で子プロセスの標準出力パイプをリダイレクトする
-
[解決済み] チャネルの要素数
-
[解決済み] ローカルファイルからio.Readerを作成する
-
[解決済み] golangにおけるバックティック(``)とダブルクォート("")の違いは何ですか?
-
[解決済み] gc」と「gccgo」の主な相違点は何ですか?
-
[解決済み] golangでISO 8601の時刻を変換するには?
-
[解決済み] 標準入力から整数を読み込む