How to import and use different packages of the same name

前端 未结 2 1206
名媛妹妹
名媛妹妹 2020-12-13 05:36

For example, I want to use both text/template and html/template in one source file. But the code below throw errors.

import (
    \"fmt\"
    \"net/http\"
          


        
相关标签:
2条回答
  • 2020-12-13 05:46
    import (
        "text/template"
        htemplate "html/template" // this is now imported as htemplate
    )
    

    Read more about it in the spec.

    0 讨论(0)
  • 2020-12-13 06:06

    Answer by Mostafa is correct, however it demands some explanation. Let me try to answer it.

    Your example code doesn't work because you're trying to import two packages with the same name, which is: " template ".

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

    Importing is a declaration statement:

    • You can't declare the same name (terminology: identifier) in the same scope.

    • In Go, import is a declaration and its scope is the file that's trying to import those packages.

    • It doesn't work because of the same reason that you can't declare variables with the same name in the same block.

    The following code works:

    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}}`)
    }
    

    The code above gives two different names to the imported packages with the same name. So, there are now two different identifiers that you can use: t for the text/template package, and h for the html/template package.

    You can check it on the playground.

    0 讨论(0)
提交回复
热议问题