mk1*_*k12 12 types declaration idiomatic instantiation go
我喜欢这样一个事实:Go并没有给我百万种方法来做简单的事情 - 借用Python的Zen,"应该有一个 - 最好只有一个 - 显而易见的方法."
但是,我不清楚实例化类型的首选/惯用方法.基本类型很简单:
n := 0
t := 1.5
str := "Hello"
Run Code Online (Sandbox Code Playgroud)
但是结构呢?以下是等效的,如果是,哪个是首选的,为什么?
var f Foo
f := Foo{}
Run Code Online (Sandbox Code Playgroud)
切片怎么样?我可以做var xs []int,xs := []int{}或者xs := make([]int),但我认为第一种选择(与结构相对)与其他选项不同?我认为这也适用于地图.
有了指针,我听说new应该避免.这是一个很好的建议,如果是的话,什么才算是有效的用法new?
我意识到这可能部分是风格问题,但在任何情况下,选择特定风格的理由都会有所帮助.
Luk*_*uke 10
声明变量时,T某些类型在哪里:
var name T
Run Code Online (Sandbox Code Playgroud)
Go为您提供了一块未初始化的"归零"内存.
对于原语,这意味着var name int它将是0,并且var name string将是"".在C中它可能被归零,或者可能是意外的.Go保证未初始化的变量是类型的零等价物.
内部切片,贴图和通道被视为指针.指针零值为零,表示它指向零内存.如果不尝试初始化,如果尝试操作它就会遇到恐慌.
该make功能专门用于切片,地图或通道.make函数的参数是:
make(T type, length int[, capacity int]) // For slices.
make(T[, capacity int]) // For a map.
make(T[, bufferSize int]) // For a channel. How many items can you take without blocking?
Run Code Online (Sandbox Code Playgroud)
切片length是它开始的项目数.容量是在需要调整大小之前分配的内存(内部,新大小*2,然后复制).有关更多信息,请参阅Effective Go:withocation with make.
结构:new(T)相当于&T{},而不是T{}.*new(T)相当于*&T{}.
切片:make([]T,0)相当于[]T{}.
地图:make(map[T]T)相当于map[T]T{}.
至于哪种方法更受欢迎,我问自己以下问题:
我现在知道函数内的值吗?
如果答案是"是",那么我选择以上其中一个T{...}.如果答案是"否",那么我使用make或new.
例如,我会避免这样的事情:
type Name struct {
FirstName string
LastName string
}
func main() {
name := &Name{FirstName:"John"}
// other code...
name.LastName = "Doe"
}
Run Code Online (Sandbox Code Playgroud)
相反,我会做这样的事情:
func main() {
name := new(Name)
name.FirstName = "John"
// other code...
name.LastName = "Doe"
}
Run Code Online (Sandbox Code Playgroud)
为什么?因为通过使用new(Name)我明确表示我打算稍后填写值.如果我使用&Name{...}它并不清楚我打算稍后在同一函数中添加/更改值而不读取其余代码.
不需要指针时,结构例外.我会使用T{},但如果我计划添加/更改值,我不会在其中添加任何内容.当然*new(T)也有效,但就像使用一样*&T{}.T{}在这种情况下更清洁,虽然我倾向于使用带有结构的指针,以避免在传递它时复制.
另外要记住的[]*struct是,a 比调整大小更简单[]struct,假设结构比指针大得多,通常是4-8个字节(64位上8个字节?).
在与Google IO的Go团队进行的Fireside聊天期间,听众中有人向Go团队询问了他们希望从该语言中学到什么。
罗布说,他希望声明变量的方法更少,并提到:
冒号等于覆盖命名的结果参数(https://plus.google.com/+AndrewGerrand/posts/LmnDfgehorU),在for循环中重用的变量令人困惑,尤其是对于闭包。但是,语言可能不会有太大变化。