Go Lang 实战

Go自定义类型(一)

2019-07-30  本文已影响0人  草莓君_

使用关键字type定义用户自定义类型,包括基于现有基础类型创建,或者是结构体、函数类型等。

type student byte
func main() {
    var name student = 1
    println(name)
}

输出:

1

1.和var、const类似,多个type定义可合并成组,可在函数或代码块内定义局部类型。

func main() {
    type (               //组
        user struct{     //结构体
            name string
            age uint8
        }
        event func(string) bool  //函数类型
    )
    u := user{"Tom",20}
    fmt.Println(u)
    
    var f event = func(s string) bool {
        println(s)
        return s != ""
    }
    f("abc")
}

输出:

{Tom 20}
abc

2.即便制定了基础类型,也只表明它们有相同的底层数据结构,两者间不存在任何关系,属于完全不同的两种类型。除操作符外,自定义类型不会继承基础类型的其他信息(包括方法)。不能视作别名,不能隐式转换,不能直接用于比较表达式。

    type data int
    var d data = 10
    var x int = d   //编译错误 cannot use d (type data) as type int in assignment
    println(x)
    println(d == x) //编译错误 invalid operation: d == x (mismatched types data and int)

3.未命名类型
与有明确标识符的bool、int、string等类型相比,数组、切片、字典、通道等类型与具体元素类型或长度等属性有关,故称作未命名类型(unnamed type)。当然,可用type为其提供具体名称,将其改变为命名类型(named type)。
具有相同声明的未命名类型被视作同一类型。

4.未命名类型转换规则:

func main() {
    type data [2]int
    var d data = [2]int{1, 2} //基础类型相同,右值为未命名类型
    fmt.Println(d)

    a := make(chan int, 2)

    var b chan<- int = a  //双向通道转换为单向通道,其中b为未命名类型
    b <- 2
}
上一篇 下一篇

猜你喜欢

热点阅读