- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我喜欢 Go 并没有给我一百万种方法来做简单事情的事实——借用 Python 之禅,“应该有一种——最好只有一种——明显的方法。”
但是,我不清楚实例化类型的首选/惯用方式。基本类型很简单:
n := 0
t := 1.5
str := "Hello"
但是结构呢?以下是等价的吗?如果是,哪个是首选?为什么?
var f Foo
f := Foo{}
slice 呢?我可以做 var xs []int
、xs := []int{}
或 xs := make([]int)
,但我认为第一个选项(与结构相反)与其他选项不同?我认为这也适用于 map 。
使用指针,我听说应该避免使用 new
。这是一个好的建议吗?如果是这样,什么可以算作 new
的有效用法?
我意识到这可能部分是风格问题,但在任何情况下,偏爱特定风格的理由都会有所帮助。
最佳答案
当你声明一个变量时,T
是某种类型:
var name T
Go 为您提供了一 block 未初始化的“归零”内存。
对于原语,这意味着 var name int
将为 0,而 var name string
将为 ""。在 C it might be zeroed, or might be something unexpected . Go 保证未初始化的变量是类型的零等价物。
内部 slice 、映射和 channel 被视为指针。指针零值为零,这意味着它指向零内存。如果不初始化,尝试操作可能会遇到 panic。
make
函数专为 slice 、 map 或 channel 而设计。 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?
slice length
是它开始的项目数。容量是需要调整大小之前分配的内存(内部,新大小 * 2,然后复制)。如需更多信息,请参阅 Effective Go: Allocation with make .
结构:new(T)
等价于 &T{}
,而不是 T{}
。 *new(T)
等价于 *&T{}
。
slice :make([]T,0)
等价于 []T{}
。
map :make(map[T]T)
等价于 map[T]T{}
。
至于首选哪种方法,我问自己以下问题:
Do I know the value(s) right now inside the function?
如果答案是"is",那么我选择上述 T{...}
之一。如果答案是“否”,那么我使用 make 或 new。
例如,我会避免这样的事情:
type Name struct {
FirstName string
LastName string
}
func main() {
name := &Name{FirstName:"John"}
// other code...
name.LastName = "Doe"
}
相反,我会这样做:
func main() {
name := new(Name)
name.FirstName = "John"
// other code...
name.LastName = "Doe"
}
为什么?因为通过使用 new(Name)
我明确表示我打算 稍后填充这些值。如果我使用 &Name{...}
就不清楚我打算稍后在同一个函数中添加/更改一个值而不阅读其余代码。
当您不需要指针时,结构异常(exception)。我将使用 T{}
,但如果我打算添加/更改值,我不会在其中添加任何内容。当然 *new(T)
也可以,但这就像使用 *&T{}
一样。 T{}
在这种情况下更简洁,尽管我倾向于使用带有结构的指针以避免在传递时复制。
要记住的另一件事,假设结构比指针大得多,[]*struct
比 []struct
更小且调整大小更便宜,这通常是 4 - 8 个字节(64 位上是 8 个字节?)。
关于types - 在 Go 中实例化类型的首选方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17605425/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!