等效于Java在GoLang中将对象作为方法参数传递

时间:2018-10-17 09:28:42

标签: go

假设我在所有地方都无聊键入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")

2 个答案:

答案 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
}

这样,您可以接受任何想要的东西。