Golang:返回指针并解除引用

时间:2017-02-16 01:55:54

标签: pointers go

所以我有一个函数getToken()

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,但这仍然无济于事。

1 个答案:

答案 0 :(得分: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]