大家好我是小西,从今天开始,我将开始更新Go基础篇的笔记
预计有5篇,基础篇写完了,再写应用篇,大致是这个计划
老手可以回顾回顾 ,温故知新~ 新手可以收藏一下 做个参考
今天更新第三篇,内容是 Go 方法和接口
Go中没有类class,但你可以类型上定义方法, 比如结构体 rect
方法:只是有一个接收者参数的函数
所以 方法 = 普通函数 + 接收者
接收者也有 两种,一种是值类型,一种是指针,有什么区别呢
如果接收者是指针,是可以修改原来的值
如果接收者不是指针,会只修改副本,非原始值
函数的参数如果是指针类型,调用时必须传入指针
函数(方法)的接收者,如果是指针,你可以传入指针或值都可以
使用指针接收者,还有一些额外好处:
- 可以修改接收者的值
- 避免每次调用对值进行复制,如果你的接收者值很大,这样做收益更高
接口 interface
接口是一种类型,包含一组方法签名
这里接口其实 和 我们的两个自定义类型没有什么关联,只是他们都出现过 Abs 方法,我的 Vertex 和 MyFloat 也不知道 有一个叫Abser 的接口
只是因为我的类型实现了接口中的方法,所以的值可以赋给 Abser 类型
官方把这种特性就 隐式实现 (Interfaces are implemented implicitly)
空 interface
interface {} 这个就是空接口,他可以放任何的类型
对于一个 interface {} 类型的值,可以使用类型断言,来判断内部具体的类型
1. Stringer 接口内部有一个 String 方法,fmt.Print 会调用这个方法
type Stringer interface { String() string}
type error interface { Error() string}
3. io.Reader 接口上的 Read 方法
func(T) Read(b []byte) (n int, err error)
package mainimport ( "fmt" "io" "strings")funcmain() { r := strings.NewReader("Hello, Reader!") b := make([]byte, 8) for { n, err := r.Read(b) fmt.Printf("n = %v err = %v b = %v\n", n, err, b) fmt.Printf("b[:n] = %q\n", b[:n]) if err == io.EOF { break } }}
r 是一个 字符串 Reader ,b 是一个 byte 类型切片,容量 8
最后 空的 interface {} 就是 any 类型,我在 builtin.go 原码中我发现了
祝你今天开心,下期见~