英文:
Compile error when comparing between named type and unamed type
问题
package main
import (
"fmt"
"html/template"
)
func main() {
fmt.Println(template.HTML("test") == "test")
htmlString := "test"
fmt.Println(template.HTML("test") == htmlString)
}
template.HTML
是Go语言中的一种类型,用于表示HTML内容。在上面的代码中,我们使用template.HTML
将字符串"test"转换为HTML类型。
第一个比较表达式template.HTML("test") == "test"
返回true
,因为template.HTML
类型的值与字符串类型的值相等。
然而,第二个比较表达式template.HTML("test") == htmlString
会产生错误。错误信息显示类型不匹配,因为template.HTML
类型与字符串类型不同。
这是因为在Go语言中,不同类型的值不能直接进行比较。尽管template.HTML
类型的值与字符串类型的值在底层表示上可能相同,但它们被视为不同的类型。
如果你想要比较template.HTML
类型的值和字符串类型的值,你可以将template.HTML
类型的值转换为字符串类型,然后进行比较。例如,你可以使用string()
函数将template.HTML
类型的值转换为字符串类型:
fmt.Println(string(template.HTML("test")) == htmlString)
这样就可以避免类型不匹配的错误。
英文:
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
document for template.HTML
:
http://golang.org/pkg/html/template/#HTML
The first comparison is true
. However, the second comparison yield following error :
> invalid operation: "html/template".HTML("test") == htmlString
> (mismatched types "html/template".HTML and string)
Can someone explain what happened under the hood ?
答案1
得分: 5
简而言之,第二个表达式是无效的,因为它们的类型不兼容。
在Go语言中,每个操作的参数必须是相同的类型。第二个表达式
template.HTML("test") == htmlString
是无效的,因为它比较的是template.HTML
和string
类型。虽然template.HTML
是从string
类型派生出来的,但它们是不兼容的。你应该像这样将变量转换为template.HTML
类型:template.HTML(htmlString)
。
但是第一个表达式
template.HTML("test") == "test"
是有效的,因为常量"test"的类型被解释为template.HTML
类型。无类型常量具有默认类型,但它可以根据编译时的上下文推断出任何派生类型。这篇文章详细解释了常量的相关知识。也许这篇文章能够解答你的问题。
英文:
In short, second expression is invalid their types are incompatible.
Every operations in Go, arguments are must be same type. The second expression
template.HTML("test") == htmlString
is invalid since it's comparing template.HTML
and string
. Although template.HTML
is driven from string
, but it is incompatible. You should cast the variable like template.HTML(htmlString)
.
But the first expression
template.HTML("test") == "test"
is valid because the type of constant "test" interpreted as template.HTML
. Untyped constant has default type, but it can be any driven type by context at compile time. This article explains about constant in detail. Maybe this article make your question clear.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论