go语言的type的比较和赋值

type的比较

两个类型要么相同要么不相同。

  • 如果两个命名类型起源于同样的声明;
  • 一个命名类型和不具名类型永远不相同;
  • 两个不具名类型相同如果他们拥有同样的字面结构且对应成员有相同的类型。具体的规则如下:
  • 两个array type相同如果他们拥有相同的element type和同样的数组长度
  • 两个slice type相同如果他们拥有相同的element type
  • 两个struct type相同如果他们有相同顺序的field,并且对应的field拥有相同的名字、类型、tag;两个不具名field被认为拥有相同的名字。不同package的非导出(小写开头)类型总是被认为不相同。
  • 两个指针相同如果指向相同的类型
  • 两个函数类型相同如果拥有同样个数的参数和返回值,且对应的具有相同的类型,且要么都是可变参数要么都不是可变参数,不需要具有同样的参数名字
  • 两个interface相同如果他们拥有同样的方法集合(方法名字相同且方法类型相同)顺序不重要。不同package的非导出方法始终不相同
  • 两个map相同如果拥有相同的key type和element type。
  • 两个channel相同如果拥有同样的类型和同样的方向。
type (
    T0 []string
    T1 []string
    T2 struct{ a, b int }
    T3 struct{ a, c int }
    T4 func(int, float64) *T0
    T5 func(x int, y float64) *[]string
)

下面的类型是相同的:
T0 and T0
[]int and []int
struct{ a, b *T5 } and struct{ a, b *T5 }
func(x int, y float64) []string 和 func(int, float64) (result []string)
下面的类型是不同的
T0 and T1 //因为他们是两个有不同声明的具名类型
func(int, float64) T0 和 func(x int, y float64) []string //因为T0和[]string不同

赋值

在下列情况中,一个值x可以被赋值给一个T类型的变量:

  • x的类型和相同
  • x的类型V和T拥有同样的底层类型且V和T中至少一个不是具名类型
  • T是一个interface类型且X的类型V实现了T
  • x是一个双向channel,T是一个channel类型,x的类型V和T具有同样的element type,且至少一个不是具名类型。
  • x是nil且T是pointer, function, slice, map, channel, or interface类型
  • x是一个没有类型的常量且可以被T的值表示
    const z = 1 其中z就是一个没有类型的常量

你可能感兴趣的:(go)