这就是我的意思:Go playground
“StringType”类型是一个字符串,仅此而已。编译器抱怨第21行,但由于某种原因,第16行没有问题(如果您评论21并取消注释22)。
这两行之间有什么区别(因为将StringType传递给同一个函数),为什么一个工作而另一个不工作?
这是代码,内联:
package main
import (
"fmt"
"strings"
)
type StringType string
const (
FirstString = "first"
SecondString = "second"
)
func main() {
fmt.Println(strings.Contains(FirstString, SecondString)) // line 16
}
func myFunc(a StringType, b StringType) bool {
return strings.Contains(a, b) // line 21
//return false
}
答案 0 :(得分:3)
Go有一个严格的打字系统。 StringType
和string
的类型不同,您需要进行类型转换。
Go规则指出:
在任何这些情况下,非常数值x都可以转换为类型T:
x可分配给T.
的值表示
x的类型和T具有相同的基础类型 ...
x是一个无类型的常量,可由类型为T
由于StringType
的基础类型为string
,因此可以进行此转换:
func myFunc(a StringType, b StringType) bool {
return strings.Contains(string(a), string(b))
//return false
}
此外,由于FirstString
和SecondString
是StringType可表示的无类型常量,因此您可以将其作为StringType
传递,如规范所述。
答案 1 :(得分:0)
在第一种情况下,你传递字符串,没问题。
在第二个中,您传递StringType
值而不是字符串。你需要通过转换它们来告诉编译器它们是字符串:
替换
return strings.Contains(a, b)
与
return strings.Contains(string(a), string(b))
答案 2 :(得分:0)
由于StringType
不类型为string
,因此无法将其分配给string
类型的任何内容。 Go是一种强类型语言。但由于StringType
和string
的基础类型相同,您可以使用conversion:
return strings.Contains(string(a), string(b))