1

这就是我的意思:去游乐场

“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
}
4

3 回答 3

3

Go 有一个严格的类型系统。StringTypestring不是同一个类型,需要进行类型转换。

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
}

此外,因为FirstStringSecondString是可由 StringType 表示的无类型常量,这将允许您将其作为 a 传递StringType,如规范所述。

于 2013-09-06T14:29:12.083 回答
0

在第一种情况下,您正在传递字符串,没问题。

在第二个中,您传递StringType值而不是字符串。您需要通过转换它们来告诉编译器它们是字符串:

代替

return strings.Contains(a, b)

return strings.Contains(string(a), string(b))
于 2013-09-06T14:26:44.347 回答
0

因为StringTypeis not of typestring它不能分配给任何 type string。Go 是一种强类型语言。但由于 和 的基础类型StringType相同string,您可以使用转换

return strings.Contains(string(a), string(b))
于 2013-09-06T14:28:59.073 回答