Golang在ARM架构Mac(M1)上的应用与开发指南

Golang在ARM架构Mac(M1)上的应用与开发指南 我正在考虑从我的英特尔Mac切换到ARM架构的Mac(M1 SoC),但我担心的是Go二进制文件是否已经支持该平台。如果不支持,那么预期的发布日期是什么时候,或者我自己为这个平台编译Go需要做哪些工作(我目前还没有做过这件事)。

2 回复

2020年11月10日

假设M1是苹果版本的arm64架构,那么Go将从即将发布的1.16版本开始支持该平台。

对于不使用cgo的纯Go程序,从GNU/Linux系统进行交叉编译应该会像往常一样正常工作。

Ian

https://groups.google.com/g/golang-nuts/c/FUAIBtGnrTo/m/4bNxqMdaAgAJ


Go1.16 里程碑 · GitHub

截止日期:2021年2月1日


Go 发布周期

Go 1.16 的开发已于11月9日冻结。接下来的步骤是发布Beta版本,然后是发布候选版本,最后是Go 1.16的最终版本。


从源代码安装 Go

更多关于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开发。

回到顶部