在命名类型和未命名类型之间进行比较时编译错误

Ran*_*Lin 0 go

package main

import (
    "fmt"
    "html/template"
)

func main() {
    fmt.Println(template.HTML("test") == "test")

    htmlString := "test"
    fmt.Println(template.HTML("test") == htmlString)
}
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/dON4eLpGN8

文档template.HTML:http: //golang.org/pkg/html/template/#HTML

第一个比较是true.但是,第二次比较产生以下错误:

无效操作:"html/template".HTML("test")== htmlString(不匹配的类型"html/template".HTML和string)

有人可以解释引擎盖下发生的事情吗?

Jae*_*ark 5

简而言之,第二个表达式无效,它们的类型不兼容.

Go中的每个操作,参数都必须是相同的类型.第二个表达

template.HTML("test") == htmlString
Run Code Online (Sandbox Code Playgroud)

是无效的,因为它是比较template.HTMLstring.虽然template.HTML是驱使string,但它是不相容的.你应该把变量变成像template.HTML(htmlString).

但第一个表达方式

template.HTML("test") == "test"
Run Code Online (Sandbox Code Playgroud)

是有效的,因为常量"test"的类型被解释为template.HTML.Untyped常量具有默认类型,但在编译时它可以是上下文的任何驱动类型.本文将详细介绍常量.也许这篇文章让你的问题清楚.