2013-03-08 79 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

相關問題