本文mark一下golang基础用法,太太太基本的就不写了,就标记一下需要去特意了解一下的。
Switch
https://github.com/golang/go/wiki/Switch
Switch的语句是默认自带break的。fallthrough 在switch语句中的可以解除break。Slice
相当于c++的指针,有length有capacity。支持a[:]的操作。如果单纯的b := a[1:3],这个只是b是个新的指针,还是指向真正存在的数组。b的capacity应该是a的-1个。
此时即使不用a来操作,a指向的数组也不会GC,因为b在指着呢。如果需要深复制,可以用copy关键字来新建数组+slice指针。defer
立马压进程序栈,反方向执行,执行的还是到达defer时候的值。
func testDefer() {
var x int = 1
defer fmt.Println("s1: ", x)
x++
defer fmt.Println("s2: ", x)
x++
fmt.Println("no defer: ", x)
}
output:
no defer: 3
s2: 2
s1: 1
指针
go的指针和c++类似。panic catch
这个try catch的样子shi一样的原始
func catchPanic() {
defer func(){
if err := recover(); err != nil {
fmt.Println(err)
}
}() //匿名函数
panic("holly shit panic")
}
output:
holly shit panic
- goroutine and channel
这两个必须得了解吧。main function是不等goroutine的,所以得用channel或者别的来让他等。
一个简单例子示范怎么用goroutine和channel。
func goroutine1(ch chan int) {
fmt.Println("hello in goroutine")
ch <- 1
}
func main() {
ch := make(chan int)
go goroutine1(ch)
fmt.Println("hello in main")
x := <- ch
fmt.Println("chan value: ", x)
}
稍微高级点的chan的示范。chan的关闭和从chan里面读数据判断合法的方式。
func send(ch chan int) {
i := 0
for i <= 3 {
ch <- i
i++
time.Sleep(100 * time.Millisecond)
}
close(ch)// 关闭意味着不再合法。
}
func main() {
ch := make(chan int)
go send(ch)
for v := range ch {
fmt.Println(v)
}
x, ok := <-ch // ok可以判断ch是否还valid
fmt.Println(ok, x)
ch <- 1 // 这句会panic,因为ch已经在send里面被close了
}