2015-04-25 36 views
0
type Country struct { 
    Code string 
    Name string 
} 

var store = map[string]*Country{} 

在这个go代码片中,键是字符串,值是指向结构体的指针。 这里使用Contry的指针有什么好处? 我可以删除“*”并获得相同的行为吗? 如:走图,键是字符串,值是指向结构的指针

var store = map[string]Country 

谢谢。

+1

我并没有专门的知识,但我的直接想法是,这将使平衡地图(如果有必要)成本更高的操作(需要移动更多内存)。由于相同的原因,获取和设置数据也会变得更加昂贵(需要复制完整的结构,而不是指向结构的指针) – Dave

回答

1

您可以使用指针或值实现相同的行为。

package main 

import (
    "fmt" 
) 

type Country struct { 
    Code string 
    Name string 
} 

func main() { 
    var store = make(map[string]*Country) 
    var store2 = make(map[string]Country) 

    c1 := Country{"US", "United States"} 

    store["country1"] = &c1 
    store2["country1"] = c1 

    fmt.Println(store["country1"].Name) // prints "United States" 
    fmt.Println(store2["country1"].Name) // prints "United States" 

} 

使用指针将结构的地址存储在映射中,而不是整个结构的副本。对于你的例子中的小结构来说,这并没有太大的区别。如果结构较大,则可能会影响性能。

+1

特别是,使用像这样的小结构,*不使用指针会更好。与往常一样,如果/当表现是一个问题时,不要猜测,基准。 –

+0

唯一需要注意的是,如果没有指针('store2 [“country1”] .Name =“X”'),你不能直接赋值。 – OneOfOne