从零开始Go语言Ⅴ-基础P3 | 青训营笔记

90 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第5天

前言
该部分对于笔者来说较为困难,更新会放缓。

性能优化

概述

随着技术及硬件设备不断发展,网站和应用程序的功能比以往更丰富,对网络和设备资源的要求越来越高。我们很难在各种网络条件和设备上实现高水平的性能,而且性能问题是多样的,只能通过对通用层面和代码本身进行优化。

工具

Go自带了一个pprof工具,这个工具可以做CPU和内存的profiling。

package main

import
    (
    "log"
    "net/http"
   _"net/http/pprof"
)
   
func main()  {
      go func() {
        //port is you coustom define.
        log.Println(http.ListenAndServe("localhost:7000", nil))
      }()
      //do your stuff.
}

优化避坑

  • map读写冲突,产生竞态

  • 尝试简化range

for range m {
}
  • 在defer语句中只能访问有名返回值,而不能直接访问匿名返回值。
package main

import (
	"fmt"
)

func main() {
	fmt.Println("return:", defer_call())
}

func defer_call() int {
	var i int
	defer func() {
		i++
		fmt.Println("defer1:", i)
	}()
	defer func() {
		i++
		fmt.Println("defer2:", i)
	}()
	return i
}

defer2: 1
defer1: 2
return: 0
package main

import (
	"fmt"
)

func main() {
	fmt.Println("return:", defer_call())
}

func defer_call() (i int) {
	defer func() {
		i++
		fmt.Println("defer1:", i)
	}()
	defer func() {
		i++
		fmt.Println("defer2:", i)
	}()
	return i
}

defer2: 1
defer1: 2
return: 2
  • nil和显式类型
    nil标志符用于表示interface、函数、maps、slices和channels的“零值”。如果你不指定变量的类型,编译器将无法编译你的代码,因为它不知道具体的类型,同时你也不能给string赋nil值。
package main

func main() {
    var value1 = nil // error
    _ = value1
    var value2 string = nil // error
    if value2 == nil { // error
        value2 = "test"
    }
}
package main

func main() {
	var value1 interface{} = nil // error
	_ = value1
	var value2 string
	if value2 == "" {
		value2 = "test"
	}
}
  • init函数
    主要逻辑开始前要声明或者一些全局的变量或者初始化操作,或者仅仅需要import一些包,并不需要使用里面的函数,那就需要使用init初始化函数,一个package中可以有多个init,比如在demo/A.go,demo/B.go都有一个init那么它们都会执行。

  • Go程序显示占用内存有时候并不是真正在用的内存,只是还没还给操作系统

待整理后持续更新

参考

  • 字节课程-Go语言原理与实践
  • 菜鸟教程-Go语言
  • Wiki-Go社区