不能在赋值中使用make([]Entry,0,100)(类型[]Entry)作为类型Map



尝试实现go映射,代码如下:

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()函数?

使用指向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)

Alhtough注意到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)

最新更新