golang基础: 基础语法 | 青训营笔记

104 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记。

golang基础

  • go用切片比较多,很少用数组。可以用append扩容,但是因为自动扩容到2 * cap(slice) 长度,所以建议make([]int, 0, capValue) 准备一块内存, capValue 需要自己估计下, 尽可能确保足够用就好。 image.png

  • go用switch不需要用break退出,go只有for循环。

  • :=只能在函数内部使用,如果声明全局变量需要使用var关键字。

  • value type:传参时需要考虑pointer,reference type:传参时不需要考虑pointer。我觉得字节课程没讲,其实不是所有的receiver都需要传指针才能改变值。 image.png

  • 打印字段的格式: image.png

  • 结构体首字母全部大写就可以用json.Marshal做序列化,直接打印只会展示十六进制编码。用json.unmarshal反序列化。 image.png

  • time.now()得到当前时间。(其实我觉得需要用的时候再看文档就够了,反正记不住。

  • 数字解析可以用stronv的库。

image.png

  • 字符串拼接优化问题,对于字符串长度不一的用string.builder最优,但是字符串长度一致下编译器会对+进行优化,更优。

image.png

  • 留意一下内核态copy。(Q&A的提问,说后面会讲)

以下所有代码都可以在这里看到:github.com/wangkechun/…

猜谜游戏

func main() {
	maxNum := 100
	rand.Seed(time.Now().UnixNano())
	secrectNumber := rand.Intn(maxNum)

	for {
		reader := bufio.NewReader(os.Stdin)
		// 换行符作为输入结束符,得到input
		input, err := reader.ReadString('\n')

		if err != nil {
			fmt.Println("error!")
			return
		}
		// 去掉换行符
		input = strings.TrimSuffix(input, "\n")

		// 利用之前说的数字解析,把字符串换成数字
		guessNumber, err := strconv.Atoi(input)
		if err != nil {
			fmt.Println("error!")
			return
		}
		if guessNumber > secrectNumber {
			fmt.Println("too high")
		} else if guessNumber < secrectNumber {
			fmt.Println("too low")
		} else {
			fmt.Println("equal")
			break
		}
	}
}

代码生成

socks5 代理

image.png

  • go 开一个routine比其他语言开一个子线程消耗少很多,做大规模网络请求压力少很多。
  • defer函数和swift的defer用法一样,都是func退出的时候做一件事情。
  • bufio是待缓冲流,reader.ReaderByte效率很低需要优化。 github.com/wangkechun/…

标题:用户9006321693578 的个人主页 - 动态 - 掘金

网址:juejin.cn/user/361124…