map [string] interface {}在golang中映射[string]字符串的速度是否更快?或“strconv”功能太慢?

时间:2013-06-04 07:58:20

标签: map interface go

我正在golang制作一个url fetcher。我是golang的新手,之前并不知道 interace {} 类型,因此我的 args_hash {} 使用map[string]string(一般哈希)将参数传递给我的提取器,例如timedatesite-path等。但是,我稍后了解了interface{}类型并将map更改为map[string]interface{}

我的fetcher中的各种函数使用args_hash{}。早些时候,我不得不转换应该是整数的args(但是由于map[string]string)的限制而使用strconv.Atoi()stuff将其作为字符串传递给整数。
e.g。

func my_def(args_hash{} map[string]string){
    url_count := strconv.Atoi(args_hash["url_count"])
   // ... use url count
    .
    .
   // ......successful url count calculated
   args_hash["success_url_count"] = strconv.Itoa(success_count)
}

我的方法提前几次这样做了,并且在它们之间多次传递了这个修改过的args_hash{}

但是现在我已经转向使用

args_hash map[string]interface{}

我不再这样做了。

使用map[string]string,获取10个特定网址所需的时间约为23秒,但是map[string]interface{}这已减少到接近一半(约12-13秒)。

这可能是什么原因?

1 个答案:

答案 0 :(得分:5)

我怀疑您可能来自动态语言 - 例如JavaScriptPerl - 它缺乏对“结构”的支持(例如,在C - 语言意义上)所以你试图使用一个地图(你称之为“哈希”)而不是Go struct,并将指针传递给结构的实例。

所以我会像这样修改你的代码:

type FetcherArgs struct {
    OkUrlCount int
    UrlCount int
    FooBar string
    // ... and so on
}

func my_def(args *FetcherArgs) {
    args.OkUrlCount += 1
    // ...
    fmt.Printf("%v\n", args.UrlCount)
    // ...
}

var args = FetchArgs{UrlCount: 42, FooBar: "Life, the Universe and Everything"}
my_def(&args)