假设我在所有地方都无聊键入current_score = 0
for alien in aliens:
if 'red_alien' == alien:
current_score += 5
elif 'green_alien' == alien:
current_score += 10
elif 'blue_alien' == alien:
current_score += 20
print(current_score)
,我在Java中引入了一种看起来像这样的方法
System.out.println(message)
在必要时我会用Java调用private void print (Object message) {
System.out.println(message);
}
和print (2)
。
在GoLang中也可以实现同样的效果吗?像这样的功能
print ("hi")
答案 0 :(得分:6)
Go是一种procedural programming语言,包含许多functional programming元素。
函数是Go中的一流类型,您可以创建函数类型的变量,可以为这些变量分配函数值,然后可以调用它们(函数值存储在其中)。
所以您可以简单地做:
var myprint = fmt.Println
myprint("Hello, playground")
myprint(1, 3.14, "\n", time.Now())
以上内容的输出(在Go Playground上尝试):
Hello, playground
1 3.14
2009-11-10 23:00:00 +0000 UTC m=+0.000000001
上面的myprint
变量的优点是它将具有与fmt.Println()
相同的签名,即:
func Println(a ...interface{}) (n int, err error)
是的,我们还可以创建一个包装函数,例如:
func myprint(a ...interface{}) (n int, err error) {
return fmt.Println(a...)
}
它的工作原理与调用fmt.Println()
相同,但是使用变量的详细程度较小,它的优点是您可以在运行时更改函数值,这非常有用编写测试时非常方便(例如,请参见Testing os.Exit scenarios in Go with coverage information (coveralls.io/Goveralls))。
有关该主题的更多信息:
Dave Cheney: Do not fear first class functions
golangbot.com: First Class Functions
另一种可能性是使用“点导入”,但我建议不要这样做:
import (
. "fmt"
)
func main() {
Println("Hello, playground")
}
使用“点导入”时,无需使用qualified identifiers即可访问已导入程序包的所有导出标识符。引用自Spec: Import declarations:
如果出现一个明确的句点(
.
)而不是名称,则在该软件包的package block中声明的所有软件包导出标识符将在导入源文件的文件块中声明,并且必须在没有限定词。
答案 1 :(得分:4)
您是否尝试过使用interface
?
func print(obj interface{}) {
// logic
}
这样,您可以接受任何想要的东西。