学习《GO语言学习笔记》的学习笔记之2.7 自定义类型 (详解)

版权声明:诸葛老刘所有 https://blog.csdn.net/weixin_39791387/article/details/87384428

本文适合初学者阅读

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

import (
    "fmt"
)

type flags byte

const (
    read flags = 1 << iota
    write
    exec
)

func main() {
    f := read | exec
    fmt.Printf("%b\n", f)  // 输出 101
    println(f)   // 输出5
    println(read)   // 输出1
    println(write)    // 输出2
    println(exec)     // 输出4  
}
  • var, const类似, 多个type定义可合并成组, 可在函数或代码块内定义局部类型.
package main

import (
    "fmt"
)

func main() {
    type (
        user struct {
            name string
            age uint8
        }    // 定义了一个结构体

        event func(string) bool  // 定义了一个函数, 类似于python中的函数闭包
    )      // 多个type定义合并成组

    u := user{"TOM", 20}  // 实例化结构化
    fmt.Println(u)

    var f event = func(s string) bool {
        println(s)      
        return s != ""  // 返回bool结果值
    }    

    fv := f("abc")
    println(fv)  // 打印bool结果值
}

以上结果输出为:

{TOM 20}
abc
true
  • 即便指定了基础类型, 也只表明它们有相同底层数据结构, 两者间不存在任何关系, 属完全不同的两种类型.
  • 不能视作别名, 不能隐式转换,不能直接用于比较表达式

未命名类型

  • 与有明确标识符的bool, int, string等类型相比, 数组, 切片, 字典, 通道等类型与具体元素类型或长度等属性有关, 故称作未命名类型
  • 可使用type为其提供具体的名称, 将其改变成命名类型
  • 具有相同声明的未命名类型被视作同一类型.
  • 容易被忽视的是struct tag, 它也属于类型组成部分, 而不仅仅是元数据描述.
  • 同样, 函数的参数顺序也属于签名组成部分.

end

猜你喜欢

转载自blog.csdn.net/weixin_39791387/article/details/87384428