Go 言語で型情報を取得する技術を理解します。reflect.TypeOf() 関数を使用して型オブジェクトを取得し、型に関する詳細なデータを取得します。型アサーションを使用して、インターフェイス値を特定の型に強制し、変換が成功した場合にその型の値を返します。型情報を保持しながら、値を JSON 文字列にエンコードおよびデコードするには、encoding/json パッケージを使用します。実際の例では、動的な型変換とカスタム JSON デコードに型情報を使用する方法を示します。
Go 言語では、型情報の取得は、開発者がさまざまな型を取得できる強力なツールです。のデータが実行時に検査および処理されます。この記事では、型情報を取得するさまざまな方法を検討し、その応用例を示す実践的な例を示します。
関数の使用は、型情報を取得するために最も一般的に使用される方法です。これは、型に関する豊富な情報を含む reflect.Type
型のオブジェクトを返します。 <pre class='brush:go;toolbar:false;'>package main
import "reflect"
func main() {
var x int = 42
t := reflect.TypeOf(x)
fmt.Println(t.Kind()) // 输出:int
}</pre>
型アサーションは、型情報を取得するもう 1 つの方法です。インターフェイス値を特定の型にキャストし、変換が成功した場合はその型の値を返し、そうでない場合は を返します。 <pre class='brush:go;toolbar:false;'>package main
func main() {
var x interface{} = 42
if i, ok := x.(int); ok {
fmt.Println(i) // 输出:42
}
}</pre>
パッケージを使用すると、型情報をエンコードおよびデコードするためのメソッドが提供されます。 json.MarshalIndent()
関数は、型情報を保持しながら、値を JSON 文字列にエンコードおよびデコードできます。 <pre class='brush:go;toolbar:false;'>package main
import "encoding/json"
func main() {
type Person struct {
Name string
Age int
}
p := Person{Name: "John", Age: 30}
b, err := json.MarshalIndent(p, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b)) // 输出:{
// "Name": "John",
// "Age": 30
// }
}</pre>
実用的なケース
型情報を取得することで、動的な型変換を実現し、異なる型に応じて異なる操作を実行できます。操作する。
package main import "reflect" func main() { var x interface{} = 42 switch t := reflect.TypeOf(x); t.Kind() { case reflect.Int: fmt.Println("x is an int") case reflect.String: fmt.Println("x is a string") default: fmt.Println("x is an unknown type") } }ケース 2: カスタマイズされたデコード
型情報を取得するには、特定の型名に基づいてさまざまな JSON 構造をデコードするように JSON デコーダーをカスタマイズすることもできます。
package main import ( "encoding/json" "fmt" "reflect" ) type Person struct { Name string Age int } func CustomUnmarshal(data []byte) (Person, error) { var p Person t := reflect.TypeOf(p) dec := json.NewDecoder(bytes.NewReader(data)) dec.UseNumber() // 忽略 JSON 数字作为浮点数 for { var key string if err := dec.Decode(&key); err != nil { return p, err } if key == "" { break } var val interface{} if field, ok := reflect.TypeOf(p).FieldByName(key); ok { val = reflect.New(field.Type).Interface() } else { val = map[string]interface{}{} } if err := dec.Decode(&val); err != nil { return p, err } reflect.ValueOf(&p).Elem().FieldByName(key).Set(reflect.ValueOf(val)) } return p, nil } func main() { data := []byte(`{ "Name": "John", "Age": 30, "Hobbies": ["running", "swimming"] }`) p, err := CustomUnmarshal(data) if err != nil { log.Fatal(err) } fmt.Println(p) // 输出:{John 30} }
型情報を取得することで、開発者は Go プログラムのデータ型についての洞察を得て、柔軟で拡張可能なコードを作成できます。
以上がGo で型情報を取得する技術をマスターするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。