版权声明:诸葛老刘所有 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