Go语言接口
接口是一种抽象的数据类型一种特殊的数据类型
成为该数据类型的前提是满足该接口内置的方法
任何其他类型的数据满足该接口方法就成为了该接口
package main
import (
"fmt"
)
type Phone interface {
call()
}
type NokiaPhone struct {
}
func (nokiaPhone NokiaPhone) call() {
fmt.Println("I am Nokia, I can call you!")
}
type IPhone struct {
}
func (iPhone IPhone) call() {
fmt.Println("I am iPhone, I can call you!")
}
func main() {
var phone Phone
phone = new(NokiaPhone)
phone.call()
phone = new(IPhone)
phone.call()
}
Go错误处理
go语言中有内置的错误接口error
可以在编码中实现error接口类型来生成错误信息
函数通常在最后的返回值返回错误信息。使用error.new可以返回一个错误信息
Go并发
go语言支持开发只需通过go关键字来开启goroutine
为轻量级线程,调度是由golang运行时经行管理
Channel(通道)
声明通道很简单,使用chan关键字,使用前需要创建:
通道可以在两个gorountine之间传递一个指定类型的值来同步运行和通讯
操作符为 <- 即可指定方向,发送和接收,未指定方向就是双向通道。
通常情况下通道不带 缓冲区,发送端发送数据,同时必须有接收端接受数据。
但是通道也可以设置 缓冲区,通过make 的第二个参数指定缓冲区大小
缓冲区的大小有限而且必须有接收端
遍历通道和关闭通道
go用range来遍历使用close()来关闭
package main
import (
"fmt"
)
func fibonacci(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x
x, y = y, x+y
}
close(c)
}
func main() {
c := make(chan int, 10)
go fibonacci(cap(c), c)
// range 函数遍历每个从通道接收到的数据,因为 c 在发送完 10 个
// 数据之后就关闭了通道,所以这里我们 range 函数在接收到 10 个数据
// 之后就结束了。如果上面的 c 通道不关闭,那么 range 函数就不
// 会结束,从而在接收第 11 个数据的时候就阻塞了。
for i := range c {
fmt.Println(i)
}
}