前言

通过本文最终实现了在M1芯片的Mac mini上的Goland的开发,并通过编译源码解决了无法DEBUG的问题。

Go 1.16版将正式支持Apple Silicon M1芯片,即arm64架构的Mac操作系统,目前go 1.16版版本为beta1,只是会在这个基础上再修修bug,改进文档等。

目前我测试M1 ARM64在编译性能上也超过了我的macbook pro 15的i9处理器,而且他还不发热,在晚上写代码的时候总能听到头上灯的电流声,太安静了有些不适应:)

本文软硬件环境:

设备:Mac Mini M1 8G/256G

Go版本: 1.15/1.16

final happy coding :) https://github.com/yoyofx/yoyogo

正文

目前有两种方式抢先体验Go1.16:

方式一:编译源代码 

MacOS需要确保安装有 rosetta 2 (https://support.apple.com/en-us/HT211861)。

当然Mac上还需要安装一些工具链:如果MacOS在升级更新后会出现其它问题比如:xcrun: error: invalid active developer path, missing xcrun

同样使用下面命令可以解决:

xcode-select --install
sudo xcode-select -switch /

安装Go1.15,从1.4开发Go的编译器需要Go本身来编译Go,那么为了编译1.16,我们首先需要amd64版本的Go1.15。

mkdir $HOME/goroots

cd $HOME/goroots

wget https://dl.google.com/go/go1.15.6.darwin-amd64.tar.gz

tar xzf go1.15.6.darwin-amd64.tar.gz

获取Go的最新源代码,clone出来之后目前master分支便是 1.16 的预发布分支。

cd $HOME/goroots

git clone https://go.googlesource.com/go gosource

要编译go的话,需要先预编译 bootstrap 响应的工具链,这个工具链本身也是需要是arm64版,不然最后make出来的还会是x86。

cd $HOME/goroots/gosource/src

arch --x86_64 env GOROOT_BOOTSTRAP=$HOME/goroots/go GODEBUG=asyncpreemptoff=1 GOOS=darwin GOARCH=arm64 ./bootstrap.bash

注意上面的编译环境变量参数中有 GODEBUG=asyncpreemptoff=1 ,这是因为我们的go 1.15是amd64版,直接在m1 mac中运行时需要依赖 rosetta 2,而目前似乎rosetta 2对于go的协程异步抢占还有bug,因此需要关闭;否则编译时会死锁并出现错误:

rosetta error: ulock_wait failure: 105

完成这步后,我们便可在 $HOME/goroots/go-darwin-arm64-bootstrap 路径下获得编译完整go的arm64工具链。

最后一步编译arm64原生go

cd $HOME/goroots/gosource/src
arch --arm64e env GOROOT_BOOTSTRAP=$HOME/goroots/go-darwin-arm64-bootstrap ./make.bash
export PATH="$PATH:$HOME/goroots/gosource/bin/"

之后就可以正常使用了。

方式二:下载Go1.16beta1

https://golang.org/dl/go1.16beta1.darwin-arm64.pkg

下载安装后可以直接使用:

go version
go1.16beta1 darwin/arm64
 

开发工具

目前Goland正式版已经开发支持Mac M1的开发。

但是目前Goland的工具链还不能正常的进行DEBUG。

编译DEBUG delve工具链

git clone https://github.com/oxisto/delve.git
git checkout -b darwin-arm64-lldb
cd delve/cmd/dlv/
go build
go install
cd $GOPATH
cp dlv/Applications/GoLand.app/Contents/plugins/go/lib/dlv/Mac/dlv 

将delve进行arm64的编译后,覆盖Goland上的版本,就可以使用了。

ok ,如上我们终于又可以在M1上编写和调试我们的框架代码了 。

Mac M1原生(ARM64)Golang dev&debug的更多相关文章

  1. 40 图 |我用 Mac M1 玩转 Spring Cloud

    我的开源 Spring Cloud 项目 PassJava 一直可以在 Windows 上正常运行,最近不是换 Mac M1 了么,想把这个项目在 M1 上跑起来,毕竟我的那台 Windows 用起来 ...

  2. (转)打开Mac OSX原生的NTFS功能

    xingchongsmbp3:~ xingchong$ xingchongsmbp3:~ xingchong$ xingchongsmbp3:~ xingchong$ sudo ln -s /Volu ...

  3. 2016年最新mac下vscode配置golang开发环境支持debug

    网上目前还找不到完整的mac下golang环境配置支持,本人配置成功,现在整理分享出来. mac最好装下xcode,好像有依赖关系安装Homebrew打开终端窗口, 粘贴脚本执行/usr/bin/ru ...

  4. 打开Mac OSX原生的NTFS功能

    插上磁盘 从finder或者使用以下命令查看到磁盘的Volume Name: diskutil list /dev/disk0 #: TYPE NAME SIZE IDENTIFIER 0: GUID ...

  5. golang remote debug和docker debug

    在编写 Go 代码的时候,因为很多时候都是需要调试服务器上的代码的,作为一个年长的工程师,肯定不能用 log.Printf 来调试问题,所以我选择了 delve 这个工具,通过 delve 我可以像本 ...

  6. Mac OSX原生读写NTFS功能开启方法

    macOX系统内建的NTFS支持默认只能读不能写 原生读写NTFS,需要自行终端命令手动开启 1. 插上磁盘 此时Mac桌面应该会显示出插入的磁盘,但是当你想把文件拖入磁盘的时候,发现是不能拖进去的, ...

  7. mac M1 php扩展 xlswriter 编译安装爬坑记录

    电脑配置 MacBook Pro(14英寸,2021年) 系统版本 macOS Monterey 12.4 芯片 Apple M1 Pro PHP环境 MAMP Pro Version 6.6.1 ( ...

  8. 【Golang】Debug :decoding dwarf section info at offset 0x0: too short

    解决方法 通过下面的方式升级dlv 来解决这个问题: go get -u github.com/derekparker/delve/cmd/dlv 下面是我记录的定位问题的过程 问题描述 博主升级到了 ...

  9. mac 下配置 protobuf golang插件 并使用

    介绍 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准Protocol Buffers 是一种轻便高效的结构化数据存储格式 可以用 ...

随机推荐

  1. BJOI2016 回转寿司

    题目链接 Description 给定一个长度为 \(N\) 的序列 \(a\),和一个区间 \([L, R]\). 求多少连续子序列的权值和在区间内,即满足 \(1 \le i \le j \le ...

  2. 落谷 P1412 经营与开发

    题目链接 Solution 用传统的思想考虑正推,发现后面的答案依赖于当前的 \(p\),你不但要记录前 \(i\) 个还要记录 \(p\),显然空间爆炸. 类似 AcWing 300. 任务安排1, ...

  3. Java IO源码分析(二)——ByteArrayInputStream 和 ByteArrayOutputStream

    简介 ByteArrayInputStream 是字节数组输入流,它继承于InputStream. 它的内部数据存储结构就是字节数组. ByteArrayOutputStream是字节数组输出流,它继 ...

  4. sqli-labs less8-10(布尔盲注时间盲注)

    less-8 布尔盲注 首先利用?id=1' and 1=1 --+和?id=1' and 1=2 --+确定id的类型为单引号''包裹.然后进行盲注. 盲注思路: 破解当前数据库名: and len ...

  5. 高速缓冲存储器Cache

    目录 概述 问题的提出 局部性原理 命中与未命中 Cache的命中率 Cache-主存系统的效率 例题 工作原理 地址映射方式(本节最重要) 直接映射 全相联映射 组相联映射 例子 替换策略 例题 写 ...

  6. Jmeter之登录接口参数化实战

    为了纪念我走过的坑(为什么有些简单的问题就是绊住我了,还是不够细啊) Jmeter之接口登录参数化实战 因为想要在登录时使用不同的数据进行测试,所以我选择了将数据进行参数化.因为涉及到新建一个接口的功 ...

  7. maven中引入jstl

    <!--jsp标签--> <dependency> <groupId>taglibs</groupId> <artifactId>stand ...

  8. js 获取某月第一天和最后一天

    1.获取某月第一天和最后一天日期 function getDateByMonth (timeStamp) { let inDate = new Date(timeStamp) let year = i ...

  9. 干货满满:python实现二维图制作

    python全代码如下 import re import csv import matplotlib.pyplot as plt x=[] y=[] m=eval(input()) #输入折线条数 f ...

  10. 唐诗宋词APP

    古诗词个人爱好,已收集5万多首唐诗以及1万多首宋词,因时间有限目前只开发了苹果版,后期开发安卓版, <风月醉>一 国学经典,有兴趣的可以下载学习古诗词,有问题可以留言哦! https:// ...