Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在go中使用静态类型构造函数是否有明显的缺点?_Go - Fatal编程技术网

在go中使用静态类型构造函数是否有明显的缺点?

在go中使用静态类型构造函数是否有明显的缺点?,go,Go,我总是发现go中的package.New()语法很难使用 建议是,如果一个包只包含一个类型,使用package.New()创建一个实例;如果存在多种类型,请使用package.NewBlah()。 但是,如果您有一个带有New()api的现有包,向该包添加新的外部类型会破坏api,因为您现在必须重命名此NewFoo()。现在你必须去改变任何使用New()的东西,这非常令人恼火 …我只是对写这篇文章的美学不满: import "other" import "bar" import "foo"

我总是发现go中的package.New()语法很难使用

建议是,如果一个包只包含一个类型,使用package.New()创建一个实例;如果存在多种类型,请使用package.NewBlah()。

但是,如果您有一个带有New()api的现有包,向该包添加新的外部类型会破坏api,因为您现在必须重命名此NewFoo()。现在你必须去改变任何使用New()的东西,这非常令人恼火

…我只是对写这篇文章的美学不满:

import "other"
import "bar"
import "foo"

o := other.New()  // <-- Weird, what type am I getting? No idea.
x := bar.New()  
y := foo.NewFoo() // <-- Awkward, makes constructor naming look inconsistent   
z := foo.NewBar() 
导入“其他”
导入“条”
导入“foo”

o:=other.New()/是的,它有一个缺点。这种方法可能会产生不必要的垃圾—这取决于特定Go编译器实现的优化程度。

是的,它有一个缺点。这种方法可能会产生不必要的垃圾—这取决于特定Go编译器实现的优化程度。

它不是非常惯用的方法,如果做得不好,可能会产生多余的垃圾,正如您所注意的那样。实际上,您只是在为对象创建一个Init方法。我自己并没有使用太多的构造函数,倾向于为我的对象设置有效的零值,并且只在不成立的情况下使用构造函数

在您的情况下,我想我应该停止调用new方法,而是调用Init或Setup来更好地反映它在做什么。这样可以避免给人们错误的想法

编辑:

我应该在这里更详细。调用Init或Setup方法,然后在零值上使用它,可以更好地反映消费者的情况。乙二醇

f := &foo{}
f.Init()

这避免了多余的垃圾,并提供了您所描述的初始化方法。

这不是非常惯用的方法,如果做得不好,可能会产生多余的垃圾。实际上,您只是在为对象创建一个Init方法。我自己并没有使用太多的构造函数,倾向于为我的对象设置有效的零值,并且只在不成立的情况下使用构造函数

在您的情况下,我想我应该停止调用new方法,而是调用Init或Setup来更好地反映它在做什么。这样可以避免给人们错误的想法

编辑:

我应该在这里更详细。调用Init或Setup方法,然后在零值上使用它,可以更好地反映消费者的情况。乙二醇

f := &foo{}
f.Init()

这避免了多余的垃圾,并为您提供了您所描述的初始值设定方法。

我想这只是一个意见问题,但是一个名为foo的包可以构造foo和bar,它似乎是唯一一个通过修改方法变得更干净的人为示例。一个好名字的包不会消除任何疑问吗
New
会返回什么?拜托,你在真实的包中总是看到这一点。这完全不是一个做作的例子。grep“func.*新[a-Z]”*-R | wc on the go代码库;单在核心库中就有151个实例。很抱歉,我不是想吹毛求疵,我只是建议这种方法可以解决一种类型的包结构,而不是更“go风格”的代码组织。该语言的一个既定目标是尽量减少冗余数据的键入。如果这比+1更适用,我也很感兴趣这种方法是否还有其他含义。我想这只是一个意见问题,但一个名为foo的包可以构造foo和bar,它似乎是唯一一个通过修改方法变得更干净的人为示例。一个好名字的包不会消除任何疑问吗
New
会返回什么?拜托,你在真实的包中总是看到这一点。这完全不是一个做作的例子。grep“func.*新[a-Z]”*-R | wc on the go代码库;单在核心库中就有151个实例。很抱歉,我不是想吹毛求疵,我只是建议这种方法可以解决一种类型的包结构,而不是更“go风格”的代码组织。该语言的一个既定目标是尽量减少冗余数据的键入。如果这比+1更适用于你,我也对这种方法是否有其他影响感兴趣。你能解释一下吗?我不明白。foo.foo{}.New()在输入foo.foo.New()时存在foo.foo{}的两个实例,其中一个变得不可访问。只有当New()函数很愚蠢并且返回一个新实例时,这才是真的(在我的示例中,my bad)。请参见上面的new Foo.new()函数;这就避免了这个问题。不,New()方法已经在一个不必要复制的实例上工作了,这个实例就是它的接收者。你能解释一下吗?我不明白。foo.foo{}.New()在输入foo.foo.New()时存在foo.foo{}的两个实例,其中一个变得不可访问。只有当New()函数很愚蠢并且返回一个新实例时,这才是真的(在我的示例中,my bad)。请参见上面的new Foo.new()函数;这就避免了这个问题。不,New()方法已经在一个不必要复制的实例上工作了,该实例就是它的接收者。这样做的副作用是不是一个问题,您可以调用
Foo{}.New().New().New()
?在这里可以看到(我还在学习围棋),在OP中,垃圾的过度创建是有保证的——不仅仅是在做得不好的情况下。每个foo.foo{}都会创建一个新实例,然后通过值(复制)将该实例传递给.new(),并将其丢弃。这并不是说它应该被命名为Init/Setup等。这是一个明显错误的做法。你是对的,我应该在我的回答中更详细。我对它进行了修改,以更好地反映我的意思。这样做的副作用是不是有问题,因为您可以调用
Foo{}.New().New().New()
?在这里可以看到(我还在学习围棋),在OP中,垃圾的过度创建是有保证的——不仅仅是在做得不好的情况下。每个foo.foo{}都会创建一个新实例,然后通过值(复制)将该实例传递给.new(),并将其丢弃。这并不是说它应该被命名为Init/Setup等。它是一个普通的wron
f := &foo{}
f.Init()