2

我主要是一名 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 中所指的正确名称

4

2 回答 2

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)
}
于 2013-03-08T12:34:17.013 回答
3

不知道“模块属性”是什么意思(Go 规范不知道这样的事情)。只能猜测:

package main

import "fmt"

func main() {
        m := map[string]func(va ...interface{}) (int, error){"Println": fmt.Println}
        m["Println"]("Hello, playground")
}

(也在这里


输出

Hello, playground
于 2013-03-08T07:06:51.300 回答