前提と理解していること
タイプアサーション -> 元の型情報を復活させると認識しております。
下記のコードであれば、do()を呼び出した際に引数がinterface{}で、元々の呼び出しが
do(10)であるとint型がくると分かっているので
処理内で「あ、じゃあiをタイプアサーションしよう」となることは理解出来ます。
Go
1 2func do(i interface{}) { 3 // ii := i * 2 // iはinterface{}型なのでこれが出来ない。 4 ii := i.(int) 5 fmt.Println(ii) // 10 6} 7 8func TypeAssertion() { 9 do(10) 10 do("Hello") // これも対応させるにはswitch typeを使う。 11}
疑問に思ったコード
token.Claims.(jwt.MapClaims)
の部分で型アサーションをしています。
なぜjwt.MapClaimsにアサーションできると実装者側は分かるのでしょうか?
上記の例で書いたコードのように呼び出しもとの引数の型などが分かれば対処できそうな気がするのですが、要するに「Claimsだ、じゃあjwt.MapClaimsに型アサーションしよう」となる理由が分かりません。
Go
1 token := jwt.New(jwt.SigningMethodHS256) // *Tokenを返す 2 claims := token.Claims.(jwt.MapClaims) 3 claims["user_id"] = u.ID 4 claims["exp"] = time.Now().Add(time.Hour * 24).Unix()
上記コードで必要な情報
Go
1 2 // Token構造体 ※一部省略しています。 3 type Token struct { 4 Claims Claims 5 } 6 7 type Claims interface { 8 Valid() error 9 } 10 11 type MapClaims map[string]interface{} 12
宜しくお願いいたします。
どのjwtライブラリの話でしょうか?
回答1件
あなたの回答
tips
プレビュー