3

我正在 golang 中制作一个 url fetcher。我是 golang 的新手,之前不知道interace{}类型,因此map[string]string用于我的args_hash{}(将参数传递给我的 fetcher 的通用哈希,例如,time等)。但是,我后来了解了type 并将我的更改为.datesite-pathinterface{}mapmap[string]interface{}

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

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 个特定 url 所需的时间约为 23 秒,但是map[string]interface{}这已减少到近一半(大约 12-13 秒)。

这可能是什么原因?

4

1 回答 1

5

我怀疑你可能来自一种动态语言——比如JavaScriptPerl——它缺乏对“结构”的支持(C例如,在 -language 意义上),所以你正在尝试使用映射(你称之为“哈希”)而不是 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)
于 2013-06-04T09:00:30.317 回答