нельзя использовать make ([] Entry, 0, 100) (type [] Entry) в качестве типа Map в назначении - PullRequest
0 голосов
/ 13 апреля 2020

Попытка реализовать карту 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() функцию?

1 Ответ

0 голосов
/ 13 апреля 2020

Использование указателя на 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)
...