go - map 实现 - Lookup() 和 Insert() 中的代码异味

标签 go

下面的代码是使用数组、 slice 和指针的 Map 实现:

package gomap

import "fmt"

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 (m *Map) Lookup(key string) float64 {

    bucketNumber := (key[0] - 'A') / 7
    for _, entry := range m[bucketNumber] { // (*m)[bucketNumber]
        if entry.stockName == key {
            return entry.stockValue
        }
    }
    return 0
}

func (m *Map) Insert(key string, value float64) {

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

    if cap(m[bucketNumber]) == 0 { // (*m)[bucketNumber]
        fmt.Println("bucket number:", bucketNumber)
        m[bucketNumber] = make([]Entry, 0, 100)
    }

    m[bucketNumber] = append(m[bucketNumber], Entry{key, value})
    emptyPosition[bucketNumber]++
}
package main

import (
    "fmt"

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

func main() {

    var stockData = gomap.Newmap()


    (&stockData).Insert("AAPL", 94.56)
    (&stockData).Insert("HSCO", 26.72)
    (&stockData).Insert("NMZN", 697.45)
    (&stockData).Insert("ZSFT", 50.81)
    (&stockData).Insert("PMGN", 150.83)

    fmt.Println((&stockData).Lookup("AAPL"))
    fmt.Println((&stockData).Lookup("HSCO"))
    fmt.Println((&stockData).Lookup("NMZN"))
    fmt.Println((&stockData).Lookup("ZSFT"))
    fmt.Println((&stockData).Lookup("PMGN"))

}

代码气味bucketNumber := (key[0] - 'A') / 7可以通过读取位和哈希来处理。

但对于 type bucket []Entry

如何制作混凝土类型Map , Entry类型不可知论?因为 key 固定为 string值固定为 float64

最佳答案

我完成了这样的家庭作业:

package gomap

import "fmt"

type Entry struct {
    key, value interface{}
}

type Map struct {
    buckets [4][]Entry
}

func Newmap() *Map {
    return &Map{}
}

func (m *Map) bucketNumber(key interface{}) int {
    s := fmt.Sprint(key)
    return int(s[0]) % len(m.buckets)
}

func (m *Map) Lookup(key interface{}) interface{} {
    bucketNumber := m.bucketNumber(key)
    for _, entry := range m.buckets[bucketNumber] {
        if entry.key == key {
            return entry.value
        }
    }
    return nil
}

func (m *Map) Insert(key interface{}, value interface{}) {
    bucketNumber := m.bucketNumber(key)
    m.buckets[bucketNumber] = append(m.buckets[bucketNumber], Entry{key, value})
}

https://play.golang.org/p/KmVSeDavc3y

关于go - map 实现 - Lookup() 和 Insert() 中的代码异味,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61276383/

相关文章:

google-app-engine - SSL : CERTIFICATE_VERIFY_FAILED on GAE/Go

pointers - 戈朗 : Assigning a value to struct member that is a pointer

go - 创建一个简单的 Json 响应 GO

dictionary - 从 map[string]string 获取单个键值

go - golang中RWMutex.Lock()的实现

go - 使用 go 测试基于 urfave/cli 的应用程序

go - true 或 false 应该终止回调迭代吗?

c# - 将 C# SHA1 代码转换为 Golang

json - 无法让 Json 在 ag Grid 中显示只是说正在加载

go - 无法使用 GO 中的网络库执行简单的 HTTP POST。我究竟做错了什么?