Pointers 取消对Golang中地图索引的引用

Pointers 取消对Golang中地图索引的引用,pointers,go,Pointers,Go,我目前正在学习Go,我制作了这个简单而粗糙的清单程序,只是为了修补结构和方法,了解它们是如何工作的。在驱动程序文件中,我尝试从出纳类型的项目映射调用方法和项目类型。我的方法让指针接收器直接使用结构,而不是复制。当我运行该程序时,我收到以下错误\driver.go:11:无法调用f[0]上的指针方法 .\driver.go:11:无法获取f[0]的地址 Inventory.go: package inventory type item struct{ itemName string

我目前正在学习Go,我制作了这个简单而粗糙的清单程序,只是为了修补结构和方法,了解它们是如何工作的。在驱动程序文件中,我尝试从出纳类型的项目映射调用方法和项目类型。我的方法让指针接收器直接使用结构,而不是复制。当我运行该程序时,我收到以下错误
\driver.go:11:无法调用f[0]上的指针方法
.\driver.go:11:无法获取f[0]的地址

Inventory.go:

package inventory


type item struct{
    itemName string
    amount int
}

type Cashier struct{
    items map[int]item
    cash int
}

func (c *Cashier) Buy(itemNum int){
    item, pass := c.items[itemNum]

    if pass{
        if item.amount == 1{
            delete(c.items, itemNum)
        } else{
            item.amount--
            c.items[itemNum] = item 
        }
        c.cash++
    }
}


func (c *Cashier) AddItem(name string, amount int){
    if c.items == nil{
        c.items = make(map[int]item)
    }
    temp := item{name, amount}
    index := len(c.items)
    c.items[index] = temp
}

func (c *Cashier) GetItems() map[int]item{
    return c.items;
}

func (i *item) GetName() string{
    return i.itemName
}

func (i *item) GetAmount() int{
    return i.amount
}
Driver.go:

package main

import "fmt"
import "inventory"

func main() {
    x := inventory.Cashier{}
    x.AddItem("item1", 13)
    f := x.GetItems()

    fmt.Println(f[0].GetAmount())
}

真正与我的问题相关的代码部分是
inventory.go
中的
GetAmount
函数和
驱动程序中的print语句。go

无法寻址映射条目(因为它的地址在映射增长/收缩期间可能会更改),因此不能对它们调用指针接收器方法


这里的细节:

正如沃尔克在回答中所说的那样——你无法在地图上找到物品的地址。您应该做的是在地图中存储指向项目的指针,而不是存储项目值:

package main

import "fmt"

type item struct {
    itemName string
    amount   int
}

type Cashier struct {
    items map[int]*item
    cash  int
}

func (c *Cashier) Buy(itemNum int) {
    item, pass := c.items[itemNum]

    if pass {
        if item.amount == 1 {
            delete(c.items, itemNum)
        } else {
            item.amount--
        }
        c.cash++
    }
}

func (c *Cashier) AddItem(name string, amount int) {
    if c.items == nil {
        c.items = make(map[int]*item)
    }
    temp := &item{name, amount}
    index := len(c.items)
    c.items[index] = temp
}

func (c *Cashier) GetItems() map[int]*item {
    return c.items
}

func (i *item) GetName() string {
    return i.itemName
}

func (i *item) GetAmount() int {
    return i.amount
}

func main() {
    x := Cashier{}
    x.AddItem("item1", 13)
    f := x.GetItems()
    fmt.Println(f[0].GetAmount()) // 13
    x.Buy(0)
    f = x.GetItems()
    fmt.Println(f[0].GetAmount()) // 12
}

虽然其他答案很有用,但我认为在这种情况下,最好让非变异函数使用指针:

func (i item) GetName() string{
    return i.itemName
}

func (i item) GetAmount() int{
    return i.amount
}