2013-03-08 69 views
2

我主要是一名PHP开发人员,最近我开始关注Go。在PHP中,我可以做这样的事情:是否可以在Go中动态引用包属性?

<?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!") 
} 

这是否有可能?如何能够完成类似的事情?谢谢。

编辑:改变“模块”,以“包”,因为这是正确的名称是什么,我指的是在围棋

回答

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 
+0

我想我说错了“module”。在Go中,我想我会指的是软件包。 “属性”我只是指包所公开的内容。您的解决方案有效,但是您是否知道有任何方法可以在不创建地图的情况下执行此操作 – 6124j50n 2013-03-08 07:11:02

+0

您的答案似乎是唯一的解决方案,找到后:https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/JWquU5kRjIA – 6124j50n 2013-03-08 07:32:18

+2

模块/包的Go wrt属性有一个区别。 Go包不是任何Go类型的实例。这只是一个名称范围的概念。 IOW中,没有Go变量可以容纳一个包(实例/参考/ ...)以供选择器操作数'.'使用。在源代码中它看起来像那样(例如'fmt.Printf'),但这只是编译时(名称)解析机制,在运行时没有类比。 – zzzz 2013-03-08 08:30:46

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) 
} 
+0

是的,谢谢你的例子。我正在寻找包名称的反思,但不是一个结构。 – 6124j50n 2013-03-09 09:19:57

相关问题