如果我将类型定义为字符串常量,为什么我不能将该类型作为实际字符串传递给函数?

时间:2013-09-06 14:22:41

标签: go

这就是我的意思: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
}

3 个答案:

答案 0 :(得分: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可表示的无类型常量,因此您可以将其作为StringType传递,如规范所述。

答案 1 :(得分:0)

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

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

替换

return strings.Contains(a, b)

return strings.Contains(string(a), string(b))

答案 2 :(得分:0)

由于StringType 类型为string,因此无法将其分配给string类型的任何内容。 Go是一种强类型语言。但由于StringTypestring的基础类型相同,您可以使用conversion

return strings.Contains(string(a), string(b))