2017-02-16 51 views
-1

所以我有一個功能getToken()Golang:返回指針和derefrencing

func getToken() jwt.MapClaims { 
    tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkYW0iLCJwYXNzd29yZCI6InRlc3QiLCJpYXQiOjE0ODcyMDY2OTIsImV4cCI6MTUxODc2NDI5Mn0.6LQo_gRwXiFBvNIJOwtf9UuxoQMZZ3XNILTnU-46-Zg" 
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { 

     if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { 
      return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) 
     } 

     hmacSampleSecret := []byte("supersecretkittysecret") 
     return hmacSampleSecret, nil 
    }) 

    if err != nil { 
     println("error") 
    } 

    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { 
     return claims 
    } else { 
     return nil 
    } 

} 

然後調用相應:

res := getToken() 

println(res["username"]) 

爲什麼res["username"]兩個內存地址相等(0x2b3c20,0xc420075420)?這應該只是一個字符串,如adam。我也曾嘗試func getToken() *jwt.MapClaimsreturn &claims,但仍沒有幫助。

+0

你試圖使用'*資源[「用戶名]' –

+0

@GujaratSantana返回錯誤? '無效間接資源的[ 「用戶名」(類型接口{})' – adamSiwiec

+0

你嘗試'fmt.Println(RES [ 「用戶名」])',而不是'println'? –

回答

2

你應該嘗試使用fmt.Println代替println。下面是使用println VS fmt.Println打印地圖的例子

package main 

import (
    "fmt" 
) 

func foo() map[string]string { 
    return map[string]string{ 
     "k": "value", 
    } 
} 

func main() { 
    res := foo() 
    println("Output from println:", res)   // prints pointer address 
    fmt.Println("Output from fmt.Println: ", res) // prints the map 
} 

https://play.golang.org/p/gCNqng3KEE

輸出:

Output from println: 0x10432200 
Output from fmt.Println: map[k:value] 
+0

大,它的作品。這就是真正的學習聖藝術:但它爲什麼有效? – adamSiwiec