arrays - cannot use make([]Entry, 0, 100) (type []Entry) as type Map in assignment
问题描述
Trying to implement go map, with below code:
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)
gives error:
cannot use make([]Entry, 0, 100) (type []Entry) as type Map in assignment
How to pass slice header of stockData
to Insert()
function?
解决方案
使用指向Map
m
是类型[]Map
,所以m[bucketNumber]
将是类型Map
,不是bucket
。
使用时更改m
to的类型*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)
推荐阅读
- rust - 如何让 Hashmap 条目相互引用?
- javascript - 尝试在 javascript 中对 java 变量使用 .get 方法
- python - 使用来自 Google Cloud Storage 的数据在 Google Compute Engine 上训练 Resnet 时的可变性能
- git - Git远程推送错误![远程拒绝] master -> master(无法将工作树更新为新 HEAD)
- python - 如何将 python 库作为 zip 文件导入?
- ios - Xcode 打开项目耗时太长
- python - Boto3 AWS KMS 加密解密文件
- applescript - 如何防止或延长 AppleEvent 或 SpeechRecognitionServer 超时?
- ffmpeg - 压缩大部分包含静音的 mp3
- javascript - 为什么 Javascript 不能在我的三星互联网浏览器上运行?使用三星 Galaxy S7