调用 map 的成员函数类型。

huangapple go评论85阅读模式
英文:

Calling type function for a member of map

问题

我正在编写一个通信协议。它发送令牌,我需要使用这些令牌进行身份验证。
我创建了一个名为"AuthToken"的类型,用于对令牌进行编码/解码。

在"utils"包中,我声明了它和一些函数,代码如下(这只是伪代码):

package utils

type AuthToken struct{
   // 变量
}

func (token *AuthToken) Decode(encoded string){
   // 解码令牌并填充内部字段
}

func (token AuthToken) GetField() string{
   return field
}

在我的主包中,我想创建一个AuthToken的映射来存储它们,但是我不能在映射的成员中使用Decode函数,而GetField函数可以使用,代码如下:

package main

type TokenList map[string]utils.AuthToken

func main(){
   tokenList := make(TokenList)
   // 初始化一个成员的方法:
   tokenList["1"] = utils.AuthToken{} // 这个可以工作
   tokenList["2"] = make(utils.AuthToken) // 这个不行
   // 然后我需要调用上面的函数,所以我尝试了:
   tokenList["1"].Decode("encoded") // 返回"cannot call pointer method"

我尝试搜索了一下,但是要么我不知道在哪里搜索,要么没有关于如何做到这一点的信息。

英文:

I'm coding a communication protocol. It sends tokens, which I need to use to authenticate.
I have created a type, "AuthToken" that encodes/decodes the token for me.

In the package "utils", I declare it and some of the functions like this (this is like a pseudo-code):

package utils

type AuthToken struct{
   // vars
}

func (token *AuthToken) Decode(encoded string){
   // Decodes the token and fills internal fields
}

func (token AuthToken) GetField() string{
   return field
}

In my main package, I want to create a map of AuthTokens to store them, but I can't use the function Decode in a member of the map, while I can use GetField:

package main

type TokenList map[string]utils.AuthToken

func main(){
   tokenList := make(TokenList)
   // To init one member I do:
   tokenList["1"] = utils.AuthToken{} // This works
   tokenList["2"] = make(utils.AuthToken) // This doesn't
   // Then I need to call the function above, so I tried:
   tokenList["1"].Decode("encoded") // Returns cannot call pointer method

I have tried searching for it, but either I don't know where to search, or there is no info about how to do this.

答案1

得分: 1

tokenList["2"] = utils.AuthToken{} // 这样做是不行的

你不能使用make关键字来实例化一个结构体对象。这就是为什么上面的语句不起作用的原因。


tokenList["1"] = utils.AuthToken{}
tokenList["1"].Decode("encoded") // 返回无法调用指针方法

tokenList["1"]返回的是非指针对象。你需要将其存储到一个变量中,然后从那里访问指针,只有这样才能调用.Decode()方法。

obj := tokenList["1"]
objPointer := &obj
objPointer.Decode("encoded")
英文:
tokenList["2"] = make(utils.AuthToken) // This doesn't

You cannot use make keyword to instantiate an object from struct. That's the reason why above statement wont work.


tokenList["1"] = utils.AuthToken{}
tokenList["1"].Decode("encoded") // Returns cannot call pointer method

The tokenList["1"] returns non pointer object. You will need to store it into a variable, then from there do access the pointer, only then you will be able to call .Decode() method.

obj := tokenList["1"]
objPointer := &obj
objPointer.Decode("encoded")

huangapple
  • 本文由 发表于 2022年3月10日 22:33:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/71425874.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定