map[string]接口{}比golang中的map[string]字符串快吗?或是;strconv“;功能太慢?

map[string]接口{}比golang中的map[string]字符串快吗?或是;strconv“;功能太慢?,map,interface,go,Map,Interface,Go,我正在golang制作一个url抓取程序。我是golang的新手,之前不知道interace{}类型,因此对我的args_hash{}使用map[string]string(一种将参数传递给我的抓取程序的通用哈希,例如time,date,site path等)。但是,我后来了解了interface{}类型,并将我的map更改为map[string]interface{} 我的取数器中的各种函数使用args\u hash{}。早些时候,我必须使用strconv.Atoi()和stuff将本应为整数

我正在golang制作一个url抓取程序。我是golang的新手,之前不知道interace{}类型,因此对我的args_hash{}使用
map[string]string
(一种将参数传递给我的抓取程序的通用哈希,例如
time
date
site path
等)。但是,我后来了解了
interface{}
类型,并将我的
map
更改为
map[string]interface{}

我的取数器中的各种函数使用
args\u hash{}
。早些时候,我必须使用
strconv.Atoi()
stuff
将本应为整数(但由于
map[string]string的限制而作为string传递)的参数转换为整数
e、 g

我的方法在此之前做了几次,并且在它们之间多次传递了修改后的
args_hash{}

但从现在起,我开始使用

args_hash map[string]interface{}
我不再这样做了

使用
map[string]string
,获取10个特定URL所需的时间约为23秒,而使用
map[string]接口{}
则减少到近一半(约12-13秒)


这可能是什么原因?

我怀疑您可能来自一种动态语言,比如
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)

等待和下载HTTP响应是最慢的部分。除非你在做一些愚蠢的事情,否则测量时间的变化就是因为这个。您使用的类型将是您最不关心的。而且,
string
interface{}
是不可互换的,比如“我应该使用哪一个”。字符串使用
string
s,当类型为变量或未知时使用
interface{}
。我也认为等待http响应、写入数据库等应该花费大量时间。但我很确定,在这一次改变中,时差是如此之大。我不知道为什么会发生这种情况?好吧,我们需要看一些实际的代码来回答这个问题。它可能是任何东西,从Go中的bug到time.Sleep()
中的错误。非常感谢您的重做,它确实给了我对事物的新视角。但我想我会坚持使用地图。我主要使用“C”和“python”,并且认为映射/哈希在这里是一个更好的选择,因为它们易于使用,并且我可以随时从任何地方向它们动态添加字段。(好吧,这不能用结构来完成吗?如果可以,请告诉我。我将不胜感激。)@nomad,最后一个问题是——不,你不能。至于你的其他观点,我真的不明白它们是如何让事情变得更容易的:每当你在地图上添加一个新的对,你就必须修改使用新键及其值的代码的其他部分。现在试着解释一下,这与向结构中添加另一个字段有什么不同——您只需添加一行源代码就可以了?但你得到的回报是类型检查。我认为这比你想象中的编辑节省要好得多。@nomad,瞧,当它们包含的对具有一致性的属性时,贴图真的很有用,这显然不像你的情况,因为你在代码中有效地进行了基于键的硬编码类型切换。好吧,如果你坚决坚持,我会尝试一下。谢谢顺便说一句,这会让事情变得更快吗?我的意思是传递结构指针而不是映射,前者更快吗?@sje397此外,映射的可感知灵活性(它允许对其所有元素进行迭代)可以在Go by反射中得到补偿——例如,Go将任意结构的实例序列化为JSON或XML并返回没有问题。
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)