关键易错知识点总结
Stacking defers 最后进去的先出去执行 , defer 在函数返回的时候调用; 并且 defer中的函数所属的变量是初始化的时候就绑定的
slice 2种区别:
make([]int, 5 (长度), 5(容量)) 相当于初始化如下效果 [0,0,0,0,0]
make([]int , 5(容量)) 相当于初始化一个数组, 容量是5 , 但是 startIndex = 0 endIndex = 0 , 也就是 len 为0 。 其实 slice 也可以理解在 数组的基础上进行指针的移动。
Type assertions:
t, ok := i.(T) 此语句进行类型诊断, 诊断成功 ok 为 TRUE
Type switches:
switch v := i.(type) {// v 装换为T类型并且hold原始 i 对应的值; 注意 v 不是转换为 type 的 值
case T:
// here v has type T
case S:
// here v has type S
default:
// no match; here v has the same type as i
}
几个比较使用的 interface:
tostring实现:
type Stringer interface {
String() string
}
Errors
type error interface {
Error() string
}
Readers
io.Reader interface 把流的数据读入 byte[] 中
func (T) Read(b []byte) (n int, err error)
反射
反射就是用来检测存储在接口变量内部(值value;类型concrete type) pair对的一种机制,reflect.TypeOf()是获取pair中的type,reflect.ValueOf()获取pair中的value 。
convertPointer := pointer.Interface().(*float64) 将反射类型重新转换为接口变量类型
unsafe.Pointer是像*Dog类型的值这样的指针值和uintptr值之间的桥梁, 指针值和uintptr 之间的转换必须经过unsafe.Pointer作为中间媒介,操作更贴近于底层和内存
一个变量要进行指针操作必须是”可寻址的“, 而不可寻址的条件如下:满足任何一个就不可寻址
1,不可变的
2,临时结果
3,不安全
错误处理
Panic 发生后会不断往上传递最顶层的main函数(类比 Java 的 exception 要是一直不处理,则会一直往上抛出直到程序出错),随后被GO语言运行时系统收回,程序崩溃、进程也销毁,不断完善错误信息,链条底层的先打印,随后出现的是往上一层的信息,直到main层
路径环境变量
go install 编译中间结果存储在$GOPATH/pkg
pkg 存储归档目录,程序编译后的静态库文件 .a后缀结尾
学习路径 参考极客时间
GO语言技术知识单
GO语言学习路径