golang

Golang的背景优势

Golang 由 Google 公司出品,由 UNIX 作者、C 语言作者、谷歌 V8 引擎作者等大牛携手打造,影响力和生命力都有保障,是名副其实的“牛二代”。

Golang 开发团队

Golang 的明星项目 Docker、Kubernetes 奠定了 Golang 在云平台开发领域的地位。

Golang 项目

Golang的特性优势

Golang 是协程并发模型,语言层面支持并发,天生的高并发能力是Golang最大的特色。而且使用 Goroutine 不需要到操作系统内核切换,占用内存和调度开销小。

Golang 专门针对多核 CPU 进行了优化, 能够充分利用多核 CPU 硬件的优势。

Golang 提供了线程安全的channel作为协程之间的消息通信方式。

提供关键字defer,延迟执行,适合善后逻辑处理,比如可以尽早避免可能出现的资源泄漏问题。在很大程度上简化了编程,并且在语言描述上显得更为自然,增强了代码的可读性。

Go 语言不是严格的面向对象编程(OOP),它采用的是面向接口编程(IOP),是相对于 OOP 更先进的编程模式。

Golang 可直接编译成机器码,不依赖其他库,部署非常简单,而且还支持交叉编译。

Golang 工具链完善,包括编码风格、静态分析、效率检查、依赖管理这些工具都内置在语言中。

用户态与内核态

操作系统层面的线程就是所谓的「内核态线程」,「用户态线程」则多种多样,只要能满足在同一个内核线程上执行多个任务的都算,例如 coroutine、golang 的 goroutine。

为什么协程切换的代价比线程切换低?

协程占用内存空间更小,协程切换相比线程切换做的事情也更少,协程的切换只在用户态就可以完成,线程切换需要借助内核完成,用户态和内核态的切换是最主要的开销,线程切换除了和协程相同的基本的 CPU 上下文,还有线程的寄存器。

go mod

更换默认的包安装地址

如果用的 Goland,在创建项目时把 Environment 填好:https://mirrors.aliyun.com/goproxy/,direct

命令行设置方式:export GOPROXY=https://mirrors.aliyun.com/goproxy/,direct

依赖内网的代码库

  1. go mod 下载内网代码库依赖报 410 Gone 错误问题,设置全局环境变量如下格式:

export GOPRIVATE="*.mygitlab.com/*"
  1. 总是要求输入 git 密码问题。go mod 默认走 https 拉取代码,就会要求输入密码

    把指定域名下的代码库修改为走 ssh 方式拉代码,执行git config --global --edit修改配置:

[url "ssh://[email protected]"]
        insteadOf = https://mygitlab.com

调试内网依赖包

场景:当我们开发A服务时,发现内网的B依赖包有bug,需要修改B的代码,然后从A调用来调试。

说明:go.mod 的 require 写的都是明确的版本,如果只想修改 require,就需要发布B依赖包的新版本,然后更新A服务 go.mod 的 require。有一种更方便的调试代码的方式,即使用 replace 将远程包替换为本地包。

// go.mod 文件 replace 使用示例
// replace 既可以替换远程依赖包地址,还可以替换到本地地址
replace github.com/gohouse/goroom => /path/to/go/src/github.com/gohouse/goroom

引用指定分支

go mod 一般是指定 git tag 来引用指定的版本,也可以指定引用 git branch(一般用于验证功能,验证通过之后再打上 git tag)。

把 go mod require 中引用的 tag 版本改为分支名即可,此时会报错,然后直接 go run,会自动把分支名称替换为sha码,后缀为 git commit id。

官方文档

大彬博客

draven博客

Mac下golang版本切换

brew unlink go  # 解绑当前版本绑定
brew search go
brew install [email protected]  # 安装指定版本
brew link [email protected]  # 绑定指定版本
source ~/.bash_profile
go version  # 检查是否做了版本切换

Last updated

Was this helpful?