我正在golang制作一个url fetcher。我是golang的新手,之前并不知道 interace {} 类型,因此我的 args_hash {} 使用map[string]string
(一般哈希)将参数传递给我的提取器,例如time
,date
,site-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秒)。
这可能是什么原因?
答案 0 :(得分:5)
我怀疑您可能来自动态语言 - 例如JavaScript
或Perl
- 它缺乏对“结构”的支持(例如,在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)