【问题标题】:cannot use make([]Entry, 0, 100) (type []Entry) as type Map in assignment不能在赋值中使用 make([]Entry, 0, 100) (type []Entry) 作为类型 Map
【发布时间】:2020-07-25 20:42:44
【问题描述】:

尝试实现go map,代码如下:

package gomap

type Entry struct {
    stockName  string
    stockValue float64
}

type Bucket []Entry

type Map [4]Bucket

type bucketElementPosition [4]int

var emptyPosition = bucketElementPosition{0, 0, 0, 0}

func Newmap() Map {

    return Map{} // [(nil,0,0), (nil,0,0), (nil,0,0), (nil,0,0)]
}

func Insert(m []Map, key string, value float64) { // m is sliceofslices type

    bucketNumber := (key[0] - 'A') / 7

    if cap(m[bucketNumber]) == 0 { // first insert, so create the backing array
        m[bucketNumber] = make([]Entry, 0, 100)
    }
}

package main

import (
    "fmt"

    "github.com/myhub/cs61a/gomap"
)

func main() {

    var stockData = gomap.Newmap()
    gomap.Insert(stockData[:], "AAPL", 94.56)

}

m[bucketNumber] = make([]Entry, 0, 100) 给出错误:

     cannot use make([]Entry, 0, 100) (type []Entry) as type Map in assignment

如何将stockData的切片头传递给Insert()函数?

【问题讨论】:

  • 鉴于v := expr 声明了一个新的变量 v,您希望在这里声明什么新变量?唯一的变量名是m。你想要一个全新的m吗?
  • @torek 对不起,我的错,这是作业。查询已编辑
  • 对数组进行切片会得到一个切片,其元素类型数组元素类型相同。

标签: arrays dictionary go slice


【解决方案1】:

使用指向Map的指针

m 的类型为 []Map,因此 m[bucketNumber] 的类型为 Map,而不是 bucket

m 的类型更改为*Map 并在使用时取消引用:

func Insert(m *Map, key string, value float64) { // m is sliceofslices type
    bucketNumber := (key[0] - 'A') / 7

    if cap((*m)[bucketNumber]) == 0 { // first insert, so create the backing array
        (*m)[bucketNumber] = make([]Entry, 0, 100)
    }
}

并传递stockData的地址:

gomap.Insert(&stockData, "AAPL", 94.56)

请注意,Go 中的数组是次要的。如果您使用切片而不是数组(以及指向数组的指针),代码会更简单,并且可能更高效。

导出bucket 并使用[]Bucket

如果您可以导出bucket,那么您可以将m的类型更改为[]Bucket

func Insert(m []Bucket, key string, value float64) { // m is sliceofslices type
    bucketNumber := (key[0] - 'A') / 7

    if cap(m[bucketNumber]) == 0 { // first insert, so create the backing array
        m[bucketNumber] = make([]Entry, 0, 100)
    }
}

然后这样称呼它:

Insert(stockData[:], "AAPL", 94.56)

【讨论】:

  • 当我传递stockData[:] 时,我不是传递了一个24 字节的新切片头,即pointer 指向stockData 的(pointer,4,4)?
  • @overexchange 我不知道gomap.Newmap() 是什么,它不是公共回购。
  • 对不起,代码在查询中:func Newmap() Map {..}。公开回购?我没找到你
  • @overexchange NewMap() 返回一个 Map,您只需按原样传递即可。
  • 传递数组会创建一个新副本,这样不好。所以我通过stockData[:]
猜你喜欢
  • 2021-01-19
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多