Golang在ARM架构Mac(M1)上的应用与开发指南
Golang在ARM架构Mac(M1)上的应用与开发指南 我正在考虑从我的英特尔Mac切换到ARM架构的Mac(M1 SoC),但我担心的是Go二进制文件是否已经支持该平台。如果不支持,那么预期的发布日期是什么时候,或者我自己为这个平台编译Go需要做哪些工作(我目前还没有做过这件事)。
2020年11月10日
假设M1是苹果版本的arm64架构,那么Go将从即将发布的1.16版本开始支持该平台。
对于不使用cgo的纯Go程序,从GNU/Linux系统进行交叉编译应该会像往常一样正常工作。
Ian
https://groups.google.com/g/golang-nuts/c/FUAIBtGnrTo/m/4bNxqMdaAgAJ
截止日期:2021年2月1日
Go 1.16 的开发已于11月9日冻结。接下来的步骤是发布Beta版本,然后是发布候选版本,最后是Go 1.16的最终版本。
更多关于Golang在ARM架构Mac(M1)上的应用与开发指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go语言从1.16版本开始就正式支持ARM64架构的macOS(包括M1芯片)。目前Go 1.21已经发布,对Apple Silicon的支持已经非常成熟。
当前支持状态
Go官方二进制发行版包含darwin/arm64架构,可以直接下载使用:
# 下载ARM64版本的Go
wget https://go.dev/dl/go1.21.0.darwin-arm64.pkg
或者使用Homebrew安装:
# 使用Homebrew安装(自动选择ARM64版本)
brew install go
验证安装
安装后可以验证架构:
// main.go
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Printf("操作系统: %s\n", runtime.GOOS)
fmt.Printf("架构: %s\n", runtime.GOARCH)
fmt.Printf("CPU核心数: %d\n", runtime.NumCPU())
}
运行结果会显示:
操作系统: darwin
架构: arm64
CPU核心数: 8 # 具体数量取决于你的M1/M2芯片
交叉编译
你可以在任何平台上为ARM64 macOS编译:
# 从Intel Mac为M1 Mac编译
GOOS=darwin GOARCH=arm64 go build -o myapp-arm64 main.go
# 或者使用通用二进制(Universal Binary)
GOOS=darwin GOARCH=arm64 go build -o myapp-arm64 main.go
GOOS=darwin GOARCH=amd64 go build -o myapp-amd64 main.go
lipo -create -output myapp-universal myapp-arm64 myapp-amd64
CGO支持
如果你的项目使用CGO,需要确保有ARM64版本的C库:
// #cgo LDFLAGS: -L/opt/homebrew/lib -lmyclib
import "C"
性能表现
在M1/M2芯片上,Go程序的性能通常比在Intel Mac上更好,特别是对于并发密集型应用:
package main
import (
"fmt"
"time"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
results <- j * 2
}
}
func main() {
start := time.Now()
jobs := make(chan int, 100)
results := make(chan int, 100)
// 启动多个goroutine
for w := 1; w <= 8; w++ {
go worker(w, jobs, results)
}
// 发送任务
for j := 1; j <= 1000; j++ {
jobs <- j
}
close(jobs)
// 收集结果
for a := 1; a <= 1000; a++ {
<-results
}
fmt.Printf("执行时间: %v\n", time.Since(start))
}
开发工具支持
主流Go开发工具都已支持ARM64:
- VS Code with Go extension
- GoLand (JetBrains)
- Delve调试器
- 所有Go工具链(go test, go vet, go fmt等)
构建标签
如果需要为不同架构编写特定代码:
// +build arm64
package main
func optimizedForARM64() {
// ARM64特定优化
}
// +build amd64
package main
func optimizedForAMD64() {
// Intel特定优化
}
Go对Apple Silicon的支持已经是生产就绪状态,你可以放心迁移到M1/M2 Mac进行Go开发。

