2013-03-08 3 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 모듈의 내 보낸 속성과 비슷한 작업을 수행 할 수 있는지 궁금합니다. 예를 들면 다음과 같습니다 (유효한 코드가 아님).

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

나는 "모듈"이라고 말하면서 마땅치 않다. Go에서는 패키지를 언급 ​​할 것입니다. "속성"은 패키지가 노출하는 것을 의미합니다. 솔루션은 작동하지만지도를 만들지 않고이를 수행하는 방법을 알고 있습니까? – 6124j50n

+0

답변을 찾은 유일한 해결책은 다음과 같습니다. https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/JWquU5kRjIA – 6124j50n

+2

모듈/패키지의 Go Wrt 속성에는 한 가지 차이점이 있습니다 . 이동 패키지는 이동 유형의 인스턴스가 아닙니다. 그것은 이름 범위 지정 개념 일뿐입니다. IOW, 어떤 변수도 패키지 (instance/reference/...)를 나중에 선택자 피연산자'.'에 사용할 수 없습니다. 소스 코드에서 보면 (예 :'fmt.Printf'와 같이), 런타임시에 유추가없는 컴파일 타임 (이름) 해석 메커니즘 일뿐입니다. – zzzz

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

관련 문제