结构体方法
1 | type Animal struct { |
函数传参, 值参数必须传值, 指针参数必须传指针
1 | animal = Animal{} |
结构体方法传参, 值参数方法也可以传指针, 指针参数方法也可以传值
1 | animal = Animal{} |
如何选择值传递方法和指针传递方法
指针传递可以更改原值, 可以避免在执行方法是进行对象的内存拷贝.
一般情况下均使用指针传值, 并且不推荐两种方法混用.
非结构体方法
必须对普通类型进行重命名
1 | type MyFloat float64 |
接口结构
接口无需显示声明集成关系, 赋值后的接口存储了(结构的值, 结构指向的指针/值类型),
调用属性方法的时候, 直接使用指向的类型中的方法运行该结构的中的值.
1 | type IAnimal interface { |
初始化 duck, animal 为是基于值的接口
1 | duck := Duck{} |
初始化 cat, animal 为基于引用的接口
1 | cat := &Cat{} |
在结构体的方法中, 一般需要手动判断结构体是否为 nil 值
1 | func (cat *Cat) Walk () { |
但是将 nil 结构体对象传给接口结构后, 接口结构并非 nil
真正值为 nil 的接口结构
1 | type I interface {} |
数据类型断言
空接口结构 interface{}, 可以保存任意类型数据, 一般用作处理未知类型数据.
断言 t := i.(T) 如果失败触发 panic
安全断言 t, ok := i.(T) 如果失败 ok=>false, t 为 T 类型的零值
1 | switch v:=i.(type) { |
错误处理
错误继承
1 | type error interface { |
调用 Print 的时候打印的是 Error 方法的返回值.
练习
1 | type ErrNegativeSqrt float64 |
常用包 fmt
Errorf(string, interface{}) error
- Fprint 写io, (int, err)
- Print 打印 (int, err)
- Sprint 格式化字符串 (string)
带有 f 结尾为支持标记符, 带有 ln 结尾最后自动加换行.
支持输入 scan
格式化标记:
值: %v, %#v
类型: %T
布尔类型: %t
整型进制: %b %o %d %x/%X %q
浮点: %g %f %m.nf => m 宽度, n 小数位数
字符串: %s %x/%X %q
指针,管道: %p
IO 读写
b := make([]byte, 8)
n, err := io.Read(b)
err == io.EOF 表明读取结束, n 表示读取的字节(只有这些字节是有效的, 其余的是上一次读取的剩余)
包
定义: package xxx
引入: import “xxx”