r1笔记第6天 Golang(05)

这篇博客详细介绍了Golang中的内置函数,包括close、len、new、make、append、panic和recover的用法,并提供了相关示例。示例展示了如何使用defer和recover捕获panic,以及new和make的区别。此外,还提到了递归函数的应用和一个斐波那契数列的例子。博主分享了在处理etcd启动问题中遇到的挑战,强调理解组件工作原理的重要性,以及学习一个组件应关注的方面。
摘要由CSDN通过智能技术生成

内置函数:

  1. close,主要用于关闭channel
  2. len:用来求长度,比如string、array、slice、map、channel
  3. new:用来分配内存,主要用来分配值类型,比如int,struct。返回的是指针
  4. make:用来分配内存,主要用来分配引用类型,比如chan、map、slice
  5. append:用来追加元素到数组、slice中
  6. 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这个组件,要了解其工作原理,这样才方便排查问题。

要学习一个组件的模块有哪些,安装部署,启动流程、模块逻辑关系。各种状态,配置参数,故障处理。举一反三,其余的类似,多加努力。

今天开了一个小集群给小格调同学练习,到时候也上去熟悉下二进制的部署,这样才能摸透一个组件。

明天梳理这周的工作内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值