这是我参与「第五届青训营」伴学笔记创作活动的第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社区