golang 深入学习

书籍 Go 语言原本(基于 Go 1.14) Go 语言设计与实现 Go 语言高性能编程 Golang修养之路 深入解析Go Go语言高级编程 Go语言标准包解析 文章 编写和优化Go代码 KTH 的 Stefan Nilsson 教授自己写的算法和 Go 代码 github Go 语言设计模式

go
发布于 2年前

震惊!同事小张踩了 gorm 神奇的 Scan 函数的坑

gorm 简介 gorm 是 go 语言中实现的比较好的 ORM 包,且是国人开发的。项目地址 事故描述 Scan 是 gorm 提供的一个把数据库结果读取到 struct 的函数。定义如下: // Scan scan value to a struct func (s *DB) Scan(dest interface{}) *DB { return s.NewScope(s.Value).Set("gorm:query_destination", dest).callCallbacks(s.parent.callbacks.queries).db } 今天同事小张写代码的时候写了一个

go
发布于 4年前

Golang 本地编译和交叉编译

Go 语言的可移植性 Java 平台可移植性是众所都知的,Java 的可移植性依赖于其虚拟机 JVM,Java 实现了对不同平台的 JVM 的支持,那么一份 Java 代码就可以在各个平台上运行。而 Go 语言的可移植性也是依赖于其 runtime,runtime 去对接操作系统层,用户代码在 runtime 中运行,用户代码就不用去关心平台问题。 查看 Go 支持的OS和平台: > $ go version go version go1.11 darwin/amd64 liushuai@liushuaideMacBook-Pro  ~/Documents/goProject/src

go
发布于 5年前

go run 调试误区

我们写一个关于系统信号量的程序并用 go run 调试。 测试代码如下: package main import ( "os" "os/signal" "fmt" "syscall" ) func main() { sig := make(chan os.Signal) signal.Notify(sig, syscall.SIGUSR2) for { select { case s := <-sig: fmt.Println(s.String()) }

go
发布于 5年前

Go 永久阻塞的方法

我们经常需要让主 goroutine 处于永久阻塞状态,这样其他的 gorotine 就可以一直运行处理信息。下面我总结了几种可以实现永久阻塞的方法,其中大部分实例代码无法直接运行,因为 Go runtime 会检查所有 goroutine 并提示所有的 goroutine 都处于 deadlock,在实际使用中,我们添加具体的业务 goroutien 就可以运行了。 死循环 说到永久阻塞第一个想到的应该就是死循环。 package main func main() { for {} } 死循环虽然可以实现永久阻塞,但是对于 Go 而言,for 死循环所在的 goroutine 还是

go
发布于 5年前

Go语言学习笔记(3)--- http

Hello world Go 标注库 net/http 中封装了丰富的 http 服务相关的方法,只需要使用标准库就可以方便的构建 http 服务。 Hello world 示例 package main import ( "net/http" "fmt" ) type Handler struct { } func (h *Handler)ServeHTTP(rep http.ResponseWriter, req *http.Request) { rep.Write([]byte("Hello world")) } func main() { ht

go
发布于 5年前

Go语言学习笔记(2)--- pprof

在程序开发过程中我们经常需要去做性能测试、或性能排查方面的工作,而 Go 语言自带的 pprof 是个非常强大的工具,不仅使用简单而且可以用于线上服务性能的排查。 pprof 采样数据主要有三种获取方式: runtime/pprof:手动调用 pprof API 来生成和写入采样文件,灵活性高。 net/http/pporf 通过 http 服务获取采样文件,简单易用,适用服务性能排查 go test 通过 go test -bench . -cpuprofile prof.cpu 获得采样文件,适用于对函数单独性能测试 我们这里演示下 net/http/pprof 的使用 基于web应用

go
发布于 5年前

Go 常用命令记录

竞态检查器 go run -race main.go 编译反编译 // 编译 go build -gcflags="-S" go tool compile -S hello.go go tool compile -N -S hello.go // 禁止优化 // 反编译 go tool objdump <binary>

go
发布于 5年前

Go语言学习笔记(1)--- 基准测试

什么是基准测试 基准测试是测量一个程序在固定工作负载下的性能。我们通常会用来对比对同一个问题不同解决方案的性能,从而帮助我们做决定选择哪个方案更合理。 Go 的基准测试 Go 基准测试规则如下: 必须放在以 _test.go 结尾的文件中。 函数名必须以 Benchmark 开头 函数必须接受一个参数 *testing.B 没有返回值 基准测试受机器状态等因素的影响每次跑的结果很难保持完全一致,但是基本会在一个很小的范围内波动。 写一个简单的基准测试如下 import "testing" func sum() int { sum := 0 for i := 1; i &l

go
发布于 5年前