内置函数:
- close,主要用于关闭channel
- len:用来求长度,比如string、array、slice、map、channel
- new:用来分配内存,主要用来分配值类型,比如int,struct。返回的是指针
- make:用来分配内存,主要用来分配引用类型,比如chan、map、slice
- append:用来追加元素到数组、slice中
- panic和recover: 用来错误处理
example01:利用defer 和 recover函数进行捕获panic。 可以通过alarm.Do() 告警或者 debug的包导入,输出堆栈。
package main
import (
"fmt"
)
func test() {
defer func () {
if err := recover();err != nil{
fmt.Println(err)
}
}()
b := 0
a := 100/b
fmt.Println("a = ", a)
}
func main() {
test()
var a []int
a = append(a,1,2,3,4)
a = append(a,a...)
fmt.Println("result of a: ", a)
}
运行结果:
PS F:\go\src\go_dev> .\main.exe
runtime error: integer divide by zero
result of a: [1 2 3 4 1 2 3 4]
PS F:\go\src\go_dev>
example02: recover 和panic的使用。
package main
import (
"fmt"
"time"
"errors"
)
func initConfig()(err error) {
return errors.New("init config failed")
}
func test() {
defer func () {
if err := recover();err != nil{
fmt.Println(err)
}
}()
if err := initConfig();err != nil{
panic(err)
}
return
}
func main() {
for {
test()
time.Sleep(time.Second)
}
}
运行结果:
PS F:\go\src\go_dev> .\main.exe
init config failed
init config failed
init config failed
init config failed
init config failed
init config failed
PS F:\go\src\go_dev>
example03: new和make的区别,new返回指针,make直接返回类型。
package main
import(
"fmt"
)
func test() {
s1 := new([]int)
fmt.Println(s1)
s2 := make([]int, 10)
fmt.Println(s2)
*s1 = make([]int, 5)
(*s1)[0] = 100
s2[0] = 100
fmt.Println(s1)
return
}
func main() {
test()
}
运行结果:
PS F:\go\src\go_dev> .\main.exe
&[]
[0 0 0 0 0 0 0 0 0 0]
&[100 0 0 0 0]
PS F:\go\src\go_dev>
example04:递归函数,注意退出条件。 斐波拉切的这个很不错写法。拆解成小的重复单元。
package main
import (
"fmt"
"time"
)
func recusive(n int) {
fmt.Println("hello world ",n)
time.Sleep(time.Second)
if n > 1 {
return
}
recusive(n+1)
}
func factory(n int) int{
if (n == 1){
return 1
}
return factory(n-1)*n
}
func fab(n int) int {
if n <=1 {
return 1
}
return fab(n-1) + fab(n-2)
}
func main() {
fmt.Println(factory(5))
recusive(0)
for i := 0; i <10; i++{
fmt.Println(fab(i))
}
}
运行结果:
PS F:\go\src\go_dev> .\main.exe
120
hello world 0
hello world 1
hello world 2
1
1
2
3
5
8
13
21
34
55
PS F:\go\src\go_dev>
2019年12月5日,北京的天气很不错,今天有点冷。
今天处理etcd的启动问题,有static,etcd discovery,dns discovery 三种方式。etcd discovery又分为两种,自定义和通用。结果还是集群启动失败,明天继续排查问题。
通过这个,发现了一个问题,比如说etcd这个组件,要了解其工作原理,这样才方便排查问题。
要学习一个组件的模块有哪些,安装部署,启动流程、模块逻辑关系。各种状态,配置参数,故障处理。举一反三,其余的类似,多加努力。
今天开了一个小集群给小格调同学练习,到时候也上去熟悉下二进制的部署,这样才能摸透一个组件。
明天梳理这周的工作内容。