Go函数调用惯例
本文旨在探讨Go函数中的一个问题:**为什么Go函数能支持多参数返回,而C/C++、java不行?**这其实牵涉到了一个叫做函数调用惯例的问题。
本文旨在探讨Go函数中的一个问题:**为什么Go函数能支持多参数返回,而C/C++、java不行?**这其实牵涉到了一个叫做函数调用惯例的问题。
小菜刀最近在medium上阅读了一篇高赞文章《Go and CPU Caches》,其地址为https://teivah.medium.com/go-and-cpu-caches-af5d32cc5592,感觉收获颇多。小菜刀在该文章的基础上做了些修改和扩展,整理出来分享给读者朋友们。
CPU缓存体系
现代计算机处理器架构多数采用对称多处理系统(Symmetric multiprocessing system,SMS)。在这个系统中,每一个核心都当成是独立的处理器,多处理器被连接到同一个共享的主存上,并由单一操作系统来控制。
string类型和[]byte类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。
两种转换方式
go的vet工具是go代码静态诊断器,可以用以检查go项目中可通过编译但仍可能存在错误的代码,例如无法访问的代码、错误的锁使用、不必要的赋值、布尔运算错误等。
项目中需要将数据推给多个服务器,大致如下
package main
import (
"fmt"
"sync"
)
func mockSendToServer(url string) {
fmt.Printf("server url: %s\n", url)
}
func main() {
urls := []string{"0.0.0.0:5000", "0.0.0.0:6000", "0.0.0.0:7000"}
wg := sync.WaitGroup{}
for _, url := range urls {
wg.Add(1)
go func() {
defer wg.Done()
mockSendToServer(url)
}()
}
wg.Wait()
}
请读者停来下思考一下,以上代码会得到什么样的输出。
sync.Once是让函数方法只被调用执行一次的实现,其最常应用于单例模式之下,例如初始化系统配置、保持数据库唯一连接等。
sync.Once的单例模式示例
池(Pool)是指某类资源的容器,它是一种用于提高程序效率和降低系统开销的技术,比如线程池、连接池、内存池、对象池。但它们的核心理念一致:资源复用。
小菜刀读Go源码时,发现一个高频注释语句“XXX must not be copied after first use“。例如sync包下的Pool、Cond、WaitGroup、Mutex、Map和atomoic.Vaule、strings.Builder等,都有该句注释。