2013-07-22 2 views
2

올바른 go 코드를 출력하는 응용 프로그램 작성은 내장 된 "go"패키지와 일부 하위 패키지 ("go/ast" "go/token", "go/printer"등). golang : 주어진 문자열, 해당 golang 문자열 리터럴을 출력

은 당신이 ast.BasicLit 만들 필요가 문자열 리터럴 표현식을 작성하려면, 내가 문자열있어 내 이동 프로그램에서

l := &ast.BasicLit{Kind: token.STRING, Value: "\"Hello world!\""} 

을하고 나는 ast.BasicLit를 작성해야하는 경우 출력은 동일한 문자열을 충실하게 재현하는 문자열 리터럴을 생성합니다. 이것을하기 위해서, 문자열에서 문자열을 나타내는 go-syntax 리터럴을 나타내는 문자열을 파생해야합니다. (이 개념은 너무 메타이므로 모호성없이 설명하기가 어렵습니다.)

제가 찾고있는 것은 기본적으로 파이썬 내장 repr()과 같습니다. 이것은 JavaScript에서 eval()의 "반대"라고 부를 수있는 연산입니다.

예를 들어 설명해주십시오.

package main 

import (
    "repr" 
) 

// Assume the operation I'm hoping to find is implemented in the package "repr" as a function called "StrLit()" with the signature "func(v string) string". 

func main() { 
    println(repr.StrLit("Hello World!")) 
    println("a") 
    println(repr.StrLit("a")) 
    println(repr.StrLit(repr.StrLit("a"))) 
    println(repr.StrLit("This is a\ntest!")) 
    println(repr.StrLit("As is\x00this!")) 
} 

해야 출력 다음 호출이 프로그램 : (내 특정 문제가 문자열을 간주하는 동안

"Hello World!" 
a 
"a" 
"\"a\"" 
"This is a\ntest!" 
"As is\x00this!" 

, 나는 어떤 유형의 값에 일하는 것이 일반적인 솔루션에 관심이있을 것 정수 유형을 다음과 같은) 복잡한 유형 유형 플로트 :

package main 

import (
    "repr" 
) 

// Assume this time that repr.StrLit() has the signature "func(v interface{}) string". 

func main() { 
    var a int = 5 
    println(repr.StrLit(a)) 
    var c complex128 = 1.0+1.0i 
    println(repr.StrLit(c)) 
} 

프로그램이 출력해야 :

5 
1.0+1.0i 

표준 라이브러리 설명서를 꽤 많이 보았지만 찾고있는 것과 비슷한 것을 찾지 못했습니다. 바라건대 사람들이 나를 도울 수 있기를 바랍니다. 사전에

감사합니다!

답변

7

http://golang.org/pkg/fmt/#Sprintf에 % # v 포맷터가 필요합니다. 구조체와 같은 복잡한 리터럴 등 다양한 다른 유형의 예는 http://play.golang.org/p/nFAKFObXE5 :

lit := fmt.Sprintf("%#v", "foo")는 "foo는"

페이지를 인쇄합니다.

fmt 패키지에는 유용한 형식의 동사가 많이 있으므로 설명서의 런 다운을 확인하십시오.

+0

Perfect! 정확히 내가 뭘 찾고있어! 감사합니다! – AntiMS