Go 언어로 동일한 이름의 다른 패키지를 가져오고 사용하는 방법은 무엇입니까?


133

예를 들어 하나의 소스 파일에 text / template과 html / template을 모두 사용하고 싶습니다. 그러나 아래 코드는 오류를 발생시킵니다.

import (
    "fmt"
    "net/http"
    "text/template" // template redeclared as imported package name
    "html/template" // template redeclared as imported package name
)

func handler_html(w http.ResponseWriter, r *http.Request) {
    t_html, err := html.template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
    t_text, err := text.template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)

}

답변:


259
import (
    "text/template"
    htemplate "html/template" // this is now imported as htemplate
)

사양에서 이에 대해 자세히 알아보십시오 .


4
JS는의 선명도와 못을 박았다 require그리고 import내가 본 어떤 다른 언어보다 너무 훨씬 더, 문
앤디

@ r3wt : 최고. 언어. 이제까지!
매트 소목 장이

1
최상의 언어는 없으며, 일부 문제에 더 적합한 언어 만 있습니다.
Inanc Gumus

16

Mostafa의 답변은 정확하지만 약간의 설명이 필요합니다. 대답하려고 노력하겠습니다.

이름이 같은 두 개의 패키지 ( "template")를 가져 오려고하므로 예제 코드가 작동하지 않습니다.

import "html/template"  // imports the package as `template`
import "text/template"  // imports the package as `template` (again)

가져 오기는 선언문입니다.

  • 동일한 범위에서 동일한 이름 ( 용어 : identifier )을 선언 할 수 없습니다 .

  • Go에서는 import선언이며 그 범위는 해당 패키지를 가져 오려는 파일입니다.

  • 같은 블록에서 같은 이름의 변수를 선언 할 수없는 것과 같은 이유로 작동하지 않습니다.

다음 코드가 작동합니다.

package main

import (
    t "text/template"
    h "html/template"
)

func main() {
    t.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
    h.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
}

위의 코드는 이름이 같은 가져온 패키지에 서로 다른 두 가지 이름을 제공합니다. : 그래서, 당신이 사용할 수있는 두 가지 서로 다른 식별자 지금있다 t에 대한 text/template패키지 및 h을위한 html/template패키지.

운동장에서 확인할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.