我主要是一名PHP开发人员,最近我开始研究Go。在PHP中,我可以这样做:
<?php
class TestClass {
public function testMethod() {
echo "Hello!\n";
}
}
$obj = new TestClass();
$method_name = "testMethod";
$obj->{$method_name}();
?>
输出为:Hello!
。
我知道以下不是一个完美的比较,因为Go没有类,但我想知道我是否可以在Go中使用模块的导出属性做类似的事情。比如像这样的东西(我知道这不是Go代码):
package main
import "fmt"
func main() {
name := "Println"
fmt[name]("Hello!")
}
这有可能吗?如何才能完成类似的事情呢?谢谢。
编辑:将“模块”更改为“包”,因为这是我在Go中所指的正确名称
答案 0 :(得分:5)
我猜你正在寻找“反思”。
package main
import (
"fmt"
"reflect"
)
type sayer struct {
said int
}
func (s *sayer) SayHello() {
fmt.Println("Hello")
}
func main() {
s := &sayer{}
cmd := "SayHello"
reflect.ValueOf(s).MethodByName(cmd).Call(nil)
}
答案 1 :(得分:3)
不知道'模块属性'是什么意思(Go规范并不知道这样的事情)。只猜测:
package main
import "fmt"
func main() {
m := map[string]func(va ...interface{}) (int, error){"Println": fmt.Println}
m["Println"]("Hello, playground")
}
(还here)
输出
Hello, playground