Go类型在看起来不应该自动转换

时间:2016-09-27 02:07:03

标签: go types casting

对于含糊不清的标题感到抱歉。当我相信我应该基于创建一个新类型和一个接受该类型参数的函数时,我没有收到编译器错误。

示例:

package search

//Some random type alias
type Search string

//Takes a string and returns Search
func NewSearch(s string) Search {
   return Search(s)
}

//This is where things are getting weird
//Returns an int just for arbitrary testing
func PrintSearch(s Search) int{
    return 5
}

现在我的假设是,如果我使用NewSearch创建一个对象,我将能够将它传递给PrintSearch并使所有内容按预期运行,但如果我将PrintSearch传递给原始字符串,则不应该编译。我没有遇到这种情况。

主要代码:

package main
import (
    "fmt"
    ".../search" //no need to type the whole path here
)

func main() {
   SearchTerm := search.NewSearch("Test")
   StringTerm := "Another test"

   fmt.Println(search.PrintSearch(SearchTerm)) // This should print 5
   fmt.Println(search.PrintSearch(StringTerm)) // This should throw a compiler error, but it is not
}

似乎我把类型和函数写在与main相同的包中,一切都按照我的预期工作?如同,它会抛出编译器错误。有没有我错过的关于跨包类型强制的东西?

1 个答案:

答案 0 :(得分:1)

我们可以进一步简化这个例子(playground):

package main

type Foo string

type Bar int

func main() {
    var f Foo = "foo"
    var b Bar = 1

    println(f, b)
}

spec's assignability section中解释了这一点。

  

值x可分配给类型为T的变量(" x可分配给   T")在任何这些情况下:

     
      
  • x的类型与T相同。
  •   
  • x的类型V和T具有相同的基础类型,并且V或T中的至少一个不是命名类型。
  •   
  • T是接口类型,x实现T。
  •   
  • x是双向通道值,T是通道类型,x类型V和T具有相同的元素类型,并且V或T中的至少一个不是命名类型。
  •   
  • x是预先声明的标识符nil,T是指针,函数,切片,地图,通道或接口类型。
  •   
  • x是一个无类型常量,可由类型T的值表示。
  •