不能使用make([[Entry,0,100)(类型[] Entry)作为分配中的Map类型

问题描述 投票:0回答:1

[尝试实现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()功能?

dictionary go slice
1个回答
0
投票

使用指向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)
© www.soinside.com 2019 - 2024. All rights reserved.