Go语言基础语法(二)
初识Go语言,在学习Go语言之旅、菜鸟Go教程、字节内部课的同时,记录一些自己觉得可能是与其他语言不同的点,作为后续回顾的资料。
1.方法、接口
1.1 方法
- 定义:方法是带接收者参数的函数;
type Vertex struct {
X, Y float64
}
方法:
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
函数:
func Abs(v Vertex) float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
- 调用方式:函数直接使用,而方法通过接收者使用;
方法:
v := Vertex{3, 4}
v.Abs()
函数:
v := Vertex{3, 4}
Abs(v)
- 方法使用指针接收者:待更新
- 注意:接收者的类型定义和方法声明必须在同一包内;不能为内建类型声明方法。
1.2 接口
- 定义:接口类型 是由一组方法签名定义的集合。接口类型的变量可以保存任何实现了这些方法的值。
type I interface {
M()
}
type T struct {
S string
}
// 此方法表示类型 T 实现了接口 I,但我们无需显式声明此事。
func (t T) M() {
fmt.Println(t.S)
}
func main() {
var i I = T{"hello"}//等价于i := T{"hello"}
i.M()
}
- fmt.Stringer
- error:与
fmt.Stringer类似,error类型是一个内建接口;
type error interface {
Error() string
}
- io.Reader
2. 并发
2.1 Go程
- 定义:Go 程(goroutine)是由 Go 运行时管理的轻量级线程。
go f(x, y, z)
2.2 信道
- 定义:信道是带有类型的管道,你可以通过它用信道操作符
<-来发送或者接收值。
ch <- v // 将 v 发送至信道 ch。
v := <-ch // 从 ch 接收值并赋予 v。
(“箭头”就是数据流的方向。)
- 和映射与切片一样,信道在使用前必须创建:
ch := make(chan int)
- 信道可以是 带缓冲的。将缓冲长度作为第二个参数提供给
make来初始化一个带缓冲的信道:
ch := make(chan int, 100)
-
close和range:
发送者可通过
close关闭一个信道来表示没有需要发送的值了。接收者可以通过为接收表达式分配第二个参数来测试信道是否被关闭:若没有值可以接收且信道已被关闭,那么在执行完v,ok := <=ch之后ok会被设置为false。 -
select:
select语句使一个 Go 程可以等待多个通信操作。select会阻塞到某个分支可以继续执行为止,这时就会执行该分支。当多个分支都准备好时会随机选择一个执行。当
select中的其它分支都没有准备好时,default分支就会执行。为了在尝试发送或者接收时不发生阻塞,可使用
default分支:
func main() {
tick := time.Tick(100 * time.Millisecond)
boom := time.After(500 * time.Millisecond)
for {
select {
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("BOOM!")
return
default:
fmt.Println(" .")
time.Sleep(50 * time.Millisecond)
}
}
}
参考学习资料链接: