英文:
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")
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论