英文:
How should I write this function to return a pointer?
问题
假设我们有以下结构体:
type BuyerData struct {
id int
balance float64
}
type AgentData struct {
id int
buyerData BuyerData
}
type GlobalData struct {
agents map[int]AgentData
}
如果我想为GlobalData
定义一个类似于Java中的类方法的"insert"方法,以返回给定id上的buyerData
的指针,该方法的签名如下:
func (globalData *GlobalData) getBuyerData(id int) *BuyerData
在这个方法中应该写什么?我遇到了各种错误,比如cannot take the address of
、invalid indirect of
或does not support indexing
...
这是我目前写的代码,它不会产生任何编译异常:
func (globalData *GlobalData) getBuyerData(id int) *BuyerData {
var agents *map[int]AgentData = &(globalData.agents)
var agentData AgentData = (*agents)[id]
return &(agentData.buyerData)
}
但是,老实说,我不知道自己在做什么,也不知道这是否是正确的方法。
英文:
Assuming we have the following structures:
type BuyerData struct {
id int
balance float64
}
type AgentData struct {
id int
buyerData BuyerData
}
type GlobalData struct {
agents map[int]AgentData
}
if I wanted to define a "insert equivalent of Java's class method" for GlobalData
to return a pointer to it's value buyerData
on a given id, which would be a method with the following signature:
func (globalData *GlobalData) getBuyerData(id int) *BuyerData
What would be written inside it? I'm having troubles because it's giving all sorts of errors like cannot take the address of
, invalid indirect of
or does not support indexing
...
This is what I currently have that does not generate any compiler exception:
func (globalData *GlobalData) getBuyerData(id int) *BuyerData {
var agents *map[int]AgentData = &(globalData.agents)
var agentData AgentData = (*agents)[id]
return &(agentData.buyerData)
}
But I, honestly, don't know what I'm doing or if this is the correct way of doing it.
答案1
得分: 3
假设你只想返回一个指向在AgentData
结构体中由函数参数索引的map中的值的指针,你可能想要这样写:
func (agentsGlobalData *AgentData) getBuyerData(id int) (*BuyerData, bool) {
buyer, has := agentsGlobalData.agents[id]
return &buyer, has
}
你也可以考虑将指向AgentData
的指针存储在该map中,使你的结构体如下:
type GlobalData struct {
agents map[int]*AgentData
}
但是你没有告诉我们足够的关于你的用例,以便推荐其中的一种方法。
(你说调用者应该能够“写入”BuyerData
,但是该结构体中没有任何公共字段...)
英文:
Assuming you'd just like to return a pointer to the value in the map in a AgentData struct indexed by the argument of the function, you likely mean to say:
func (agentsGlobalData *AgentData) getBuyerData(id int) (*BuyerData, bool) {
buyer, has := agentsGlobalData.agents[id]
return &buyer, has
}
You might also consider storing pointers to AgentData
in that map instead, making your struct:
type GlobalData struct {
agents map[int]*AgentData
}
But you haven't told us enough about your use case to recommend one or the other, perhaps.
(You say callers should be able to "write" to a BuyerData
, but there are not any public fields in that struct...)
答案2
得分: 0
你需要这样说:
func (globalData *GlobalData) GetBuyerData(id int) *BuyerData {
if agent, found := globalData.Agents[id]; found {
return &agent.BuyerData
}
return nil
}
在这里查看:https://play.golang.org/p/lwXn4D1mr3J
英文:
You need to say something like this:
func (globalData *GlobalData) GetBuyerData(id int) *BuyerData {
if agent, found := globalData.Agents[id]; found {
return &agent.BuyerData
}
return nil
}
See it here: https://play.golang.org/p/lwXn4D1mr3J
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论