質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

2回答

1945閲覧

Golangにてstruct型からkeyに対応した型を抽出したい

fresh_fish

総合スコア20

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2022/04/10 14:58

編集2022/04/10 14:59

実現したいこと

Golangでstruct型から型の抽出をする方法を探しています。
typescriptだと以下のような記法です

typescript

1type TypeUser = { 2 name: string; 3 age: number; 4} 5 6const testString: TypeUser["name"] = "helloworld" 7const testNumber: TypeUser["age"] = 10

不可能であれば不可能と回答していただけると助かります

試したこと

refrect.Type型としての抽出は出来るのですがこれを型定義に使う方法が見つかりません

go

1package main 2 3import ( 4 "fmt" 5 "reflect" 6) 7 8func main() { 9 10type TUser struct { 11 name string 12 age int 13} 14 15TUserName := reflect.TypeOf(Tstruct{}.name) 16TUserAge := reflect.TypeOf(Tstruct{}.age) 17 18fmt.Println(TUserName) 19fmt.Println(TUserAge) 20}
string int

go

1package main 2 3import ( 4 "fmt" 5 "reflect" 6) 7 8func main() { 9 10type TUser struct { 11 name string 12 age int 13} 14 15TUserName := reflect.TypeOf(Tstruct{}.name) 16TUserAge := reflect.TypeOf(Tstruct{}.age) 17 18var testString TUserName 19var testInt TUserAge 20} 21

error_message

1TUserName (variable of type reflect.Type) is not a type 2TUserAge (variable of type reflect.Type) is not a type

補足情報(FW/ツールのバージョンなど)

go 1.18

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

go

1package main 2 3import ( 4 "fmt" 5 "reflect" 6) 7 8func main() { 9 type TUser struct { 10 name string 11 age int 12 } 13 14 TUserName := reflect.TypeOf(TUser{}.name) 15 TUserAge := reflect.TypeOf(TUser{}.age) 16 17 var testString = reflect.New(TUserName).Elem().Interface() 18 testString = "helloworld" 19 var testInt = reflect.New(TUserAge).Elem().Interface() 20 testInt = 10 21 22 fmt.Printf("testString = %v, type = %T\n", testString, testString) 23 fmt.Printf("testInt = %v, type = %T\n", testInt, testInt) 24}

bash

1$ go run main.go 2testString = helloworld, type = string 3testInt = 10, type = int

投稿2022/04/11 00:52

melian

総合スコア19771

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

reflectで構造体のフィールドの型を取得しても戻り値はType構造体なので、変数の型宣言には使えません。

https://pkg.go.dev/reflect#TypeOf
https://pkg.go.dev/reflect#Type

また、変数の型を変数で指定することは言語仕様上できないように思います。

VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .
https://hiwane.github.io/gospec-ja/#%E5%A4%89%E6%95%B0%E5%AE%A3%E8%A8%80

明示的にTypeを要求しているので、reflect.Type構造体や文字列型ではシンタックスエラーになると思います。

実際、以下のようなコードはシンタックスエラーになりました。

Go

1var testString "string" = "hello" 2var testInt 0 = 0

結論としては、reflectで取り出した型情報を変数定義に流用することは不可能だと思います。

投稿2022/04/10 16:12

madoka-t

総合スコア379

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問