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

时间:2015-03-01 08:33:27

标签: go

package main

import (
    "fmt"
    "html/template"
)

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

    htmlString := "test"
    fmt.Println(template.HTML("test") == htmlString)
}

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

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

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

  

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

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

1 个答案:

答案 0 :(得分:5)

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

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

template.HTML("test") == htmlString

无效,因为它正在比较template.HTMLstring。虽然template.HTML来自string,但它不兼容。您应该像template.HTML(htmlString)一样投射变量。

但第一个表达

template.HTML("test") == "test"

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