当前位置: 首页 > news >正文

一个golang小白使用vscode搭建Ununtu20.04下的go开发环境

文章目录

  • 前言
  • 搭建go环境
    • 下载go安装包
    • 解压go压缩包完成安装
    • 配置环境变量
    • 编写一个helloword程序
  • 安装VSCode插件
    • 安装智能提示插件
    • 安装go依赖包
    • 修改代理并重新安装依赖包
  • go.mod 和 go.work
    • go.mod
    • go.work
    • 小试一下go.work
  • 总结

前言

先交代一下背景,距离正式接触golang这门语言已经有5年时间,平时偶尔也会用go写写工具和功能,但其实充其量就是语言小白,基本上就是按照教程配置好环境,按照需求写写逻辑,能跑起来就行了。golang随着这几年的变化,这门语言的变化还是非常大的,之前写过一篇《Go环境配置时遇到的GOPATH路径以及包管理问题》,可以看出之前配置的变量很像Java早期的配置环境,从1.11 版本之后go工程不必放到 GOPATH 路径中了,通过go.mod文件来标记并跟踪每个软件包的版本,灵活度大大提高,从此 GOPATH 概念逐渐淡化,在1.18版本新引入一个新功能go.work,它被设计为解决在同一工作空间中处理多个模块的问题,使得go工程的模块管理更加方便。

简单描述下我的开发环境,Windows10 + VSCode1.58.0 + WLS1.0 - Ubuntu20.04,平时工作都是在Ubuntu上,习惯了在Linux上的开发,所以即使是自己家的电脑也安装了子系统,就当成Ubuntu 来用就行了,Vscode安装在Windows上,直接连接到子系统上进行代码编写,以上是前提,本文的重点是在Ubuntu20.04系统上安装go的编译和运行环境。

搭建go环境

我选择的go版本是1.19,已经支持 go.sumgo.work,同时也为了和工作开发保持一致,没必要用太新的特性,现在的go包管理已经不想早期的Java,不再依赖 GOPATH,和 Python3.x 更像了,只管下载包然后在各自的工程目录下使用就行了,必要时需要指定使用库的版本。

下载go安装包

go语言的官网是 https://golang.google.cn/dl/,下载1.19版本的Linux包go1.19.linux-amd64.tar.gz,这个网址通常下载很慢,可以改为go语言中文网https://studygolang.com/dl来下载1.19版本go1.19.linux-amd64.tar.gz

可以通过浏览器下载拷贝到指定位置,也可以通过wget命令下载

alberts@home-pc:~$ wget https://golang.google.cn/dl/go1.19.linux-amd64.tar.gz
--2024-01-21 17:22:11--  https://golang.google.cn/dl/go1.19.linux-amd64.tar.gz
Resolving golang.google.cn (golang.google.cn)... 203.208.50.34
Connecting to golang.google.cn (golang.google.cn)|203.208.50.34|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://dl.google.com/go/go1.19.linux-amd64.tar.gz [following]
--2024-01-21 17:22:12--  https://dl.google.com/go/go1.19.linux-amd64.tar.gz
Resolving dl.google.com (dl.google.com)... 220.181.174.161, 2401:3800:4001:807::1001
Connecting to dl.google.com (dl.google.com)|220.181.174.161|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 148796421 (142M) [application/x-gzip]
Saving to: ‘go1.19.linux-amd64.tar.gz’go1.19.linux-amd64.tar.gz      100%[==============================>] 141.90M  3.62MB/s    in 31s2024-01-21 17:22:43 (4.54 MB/s) - ‘go1.19.linux-amd64.tar.gz’ saved [148796421/148796421]

解压go压缩包完成安装

go的运行环境直接解压拷贝到指定位置就可以了,我把go解压安装到了 /usr/local/go 目录,解压之前也清理掉老的目录,如果之前没安装过,rm这条命令可以不使用

sudo su
rm -rf /usr/local/go
tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz

配置环境变量

这一步有点类似Windows中的修改注册表,我安装了新的程序,需要通知系统当使用 go 命令时需要去哪个目录下寻找可执行程序,具体操作如下

  • 使用vim编辑.bashrc文件

    alberts@home-pc:~$ vim ~/.bashrc
    
  • 到文件的末尾添加以下代码

    alberts@home-pc:~$ export PATH=$PATH:/usr/local/go/bin
    
  • 重新加载配置文件

    alberts@home-pc:~$ source ~/.bashrc
    
  • 查看版本是否安装成功

    alberts@home-pc:~$ go version
    go version go1.19 linux/amd64
    

查看版本显示出 go1.19 linux/amd64, 至此go语言的基础开发环境就配置好了

编写一个helloword程序

alberts@home-pc:/mnt/g$ mkdir wlsworkspace
alberts@home-pc:/mnt/g$ cd wlsworkspace
alberts@home-pc:/mnt/g/wlsworkspace$ mkdir hello
alberts@home-pc:/mnt/g/wlsworkspace$ cd hello/
alberts@home-pc:/mnt/g/wlsworkspace/hello$ go mod init github.com/alberts/go/hello
go: creating new go.mod: module github.com/alberts/go/hello
alberts@home-pc:/mnt/g/wlsworkspace/hello$ touch hello.go
alberts@home-pc:/mnt/g/wlsworkspace/hello$ ls
go.mod  hello.go

打开 hello.go 文件编写以下内容:

package mainimport "fmt"func main() {fmt.Println("Hello,World!")
}

保存文件后使用 go run 命令运行

alberts@home-pc:/mnt/g/wlsworkspace/hello$ go run hello.go
Hello,World!

安装VSCode插件

安装智能提示插件

为了编写go代码方便,可以安装这个名为Go的插件,这个插件不是必须安装的,但是你在写go代码时VSCode会自动提示你安装这个插件,为了实现Go语法只能提醒,我们可以直接点击提示安装,或者在插件市场里搜索安装

go插件

插件安装完成后会提示下面的报错

The “gopls” command is not available. Run “go get -v golang.org/x/tools/gopls” to install.

说明安装这个插件需要依赖 golang.org/x/tools/gopls 这个包,我们可以根据提示安装

goplugin

安装go依赖包

alberts@home-pc:/mnt/g/wlsworkspace/hello$ go get -v golang.org/x/tools/gopls
go: module golang.org/x/tools/gopls: Get "https://proxy.golang.org/golang.org/x/tools/gopls/@v/list": dial tcp 142.251.42.241:443: connect: connection refused

直接安装通常会因无法下载而失败,需要修改代理来改变下载地址

修改代理并重新安装依赖包

alberts@home-pc:/mnt/g/wlsworkspace/hello$ go env -w GO111MODULE=on
alberts@home-pc:/mnt/g/wlsworkspace/hello$ go env -w GOPROXY=https://goproxy.cn,direct
alberts@home-pc:/mnt/g/wlsworkspace/hello$ go env -w GOSUMDB="sum.golang.org"

安装依赖包

alberts@home-pc:/mnt/g/wlsworkspace/hello$ go get -v golang.org/x/tools/gopls
go: downloading golang.org/x/tools v0.17.0
go: downloading golang.org/x/tools/gopls v0.14.2
go: downloading golang.org/x/tools v0.14.1-0.20231114185516-c9d3e7de13fd
go: downloading golang.org/x/telemetry v0.0.0-20231114163143-69313e640400
go: downloading github.com/sergi/go-diff v1.1.0
go: downloading honnef.co/go/tools v0.4.5
go: downloading mvdan.cc/gofumpt v0.4.0
go: downloading mvdan.cc/xurls/v2 v2.4.0
go: downloading golang.org/x/mod v0.14.0
go: downloading golang.org/x/sync v0.4.0
go: downloading golang.org/x/text v0.13.0
go: downloading golang.org/x/exp/typeparams v0.0.0-20221212164502-fae10dda9338
go: downloading golang.org/x/sys v0.14.0
go: downloading golang.org/x/vuln v1.0.1
go: downloading github.com/google/go-cmp v0.5.9
go: downloading github.com/BurntSushi/toml v1.2.1
go: added github.com/BurntSushi/toml v1.2.1
go: added github.com/google/go-cmp v0.5.9
go: added github.com/sergi/go-diff v1.1.0
go: added golang.org/x/exp/typeparams v0.0.0-20221212164502-fae10dda9338
go: added golang.org/x/mod v0.14.0
go: added golang.org/x/sync v0.4.0
go: added golang.org/x/sys v0.14.0
go: added golang.org/x/telemetry v0.0.0-20231114163143-69313e640400
go: added golang.org/x/text v0.13.0
go: added golang.org/x/tools v0.14.1-0.20231114185516-c9d3e7de13fd
go: added golang.org/x/tools/gopls v0.14.2
go: added golang.org/x/vuln v1.0.1
go: added honnef.co/go/tools v0.4.5
go: added mvdan.cc/gofumpt v0.4.0
go: added mvdan.cc/xurls/v2 v2.4.0

这次安装成功了,这些依赖包默认安装到了 ~/go/pkg目录下,使用时直接在go文件中引用就行了 import golang.org/x/sys

以上这些包是Go语言的依赖管理工具,它们的作用如下:

  • golang.org/x/tools: 提供了一系列用于开发Go语言的工具,如gopls等
  • golang.org/x/tools/gopls: 是一个基于Go语言的代码补全和导航工具,它可以帮助开发者更高效地编写和调试Go代码
  • golang.org/x/telemetry: 提供了一套用于收集和分析应用程序性能数据的库
  • github.com/sergi/go-diff: 是一个用于比较两个Go源代码文件差异的工具
  • honnef.co/go/tools: 提供了一些用于处理Go源代码的工具,如goimports(自动导入缺失的包)等
  • mvdan.cc/gofumpt: 是一个用于格式化Go源代码的工具,它可以自动调整代码格式以符合Go语言的最佳实践
  • mvdan.cc/xurls/v2: 是一个用于解析URL的库,它可以将URL分解为各个组成部分,方便开发者处理
  • golang.org/x/mod: 是一个用于管理Go模块的库,它可以帮助你更好地组织和管理项目的依赖关系
  • golang.org/x/sync: 提供了一组同步原语,如互斥锁、条件变量等,用于实现多线程编程中的同步机制
  • golang.org/x/text: 提供了一个用于处理Unicode文本的库,它可以帮助你更方便地处理和操作文本数据
  • golang.org/x/exp/typeparams: 提供了一个用于处理类型参数的库,它可以帮助你更方便地处理泛型编程中的类型参数问题
  • golang.org/x/sys: 提供了一个用于访问操作系统功能的库,它可以帮助你更方便地处理操作系统相关的任务
  • golang.org/x/vuln: 提供了一个用于管理已知安全漏洞的库,它可以帮助你更容易地识别和修复项目中的安全漏洞
  • github.com/stamblerre/gocode: 提供Go语言的代码自动补全功能,用于IDEs和编辑器
  • github.com/uudashr/gopkgs/v2/cmd/gopkgs: 命令行工具,帮助发现和使用Go语言软件包
  • github.com/ramya-rao-a/go-outline: VSCode插件,为Go源代码文件生成结构大纲以便于导航

总结一下需要安装的依赖包

go get -v golang.org/x/tools/gopls
go get -v github.com/stamblerre/gocode
go get -v github.com/uudashr/gopkgs/v2/cmd/gopkgs
go get -v github.com/ramya-rao-a/go-outline

根据VSCode提示安装后续的Tools,得到的控制台输出信息如下

Tools environment: GOPATH=/home/alberts/go
Installing 6 tools at /home/alberts/go/bin in module mode.gopkgsgo-outlinedlvdlv-dapstaticcheckgoplsInstalling github.com/uudashr/gopkgs/v2/cmd/gopkgs (gopkgs) SUCCEEDED
Installing github.com/ramya-rao-a/go-outline (go-outline) SUCCEEDED
Installing github.com/go-delve/delve/cmd/dlv (dlv) SUCCEEDED
Installing github.com/go-delve/delve/cmd/dlv@master (/home/alberts/go/bin/dlv-dap) SUCCEEDED
Installing honnef.co/go/tools/cmd/staticcheck (staticcheck) SUCCEEDED
Installing golang.org/x/tools/gopls (gopls) SUCCEEDEDAll tools successfully installed. You are ready to Go :).

go.mod 和 go.work

go.mod

Go语言从1.11版本开始引入了Go Modules,这个版本之后不再需要将项目放到GOPATH中

Go Modules是Go语言的依赖管理工具,它改变了之前必须使用GOPATH来管理依赖的模式。在Go 1.11及之后的版本中,通过go.mod文件来标记并跟踪每个软件包的版本,这意味着开发者可以在任何地方创建项目,而不必遵循GOPATH目录结构。

此外,Go团队还增加了一个环境变量GO111MODULE来控制模块支持的启用和禁用。这个环境变量的命名中的"111"象征着它是在Go 1.11版本中引入的。

总的来说,Go语言自1.11版本起,通过引入Go Modules,使得开发者不再受限于GOPATH,可以更加灵活地管理项目和依赖。这一变化被广泛认为是Go语言发展中的一个重大改进。

go.work

“go.work” 是Go 1.18版本新引入的一个功能,它被设计为解决在同一工作空间中处理多个模块的问题。在之前的版本中,开发者常常会遇到路径问题、版本冲突问题等挑战。为了应对这些情况,他们可能需要对每个模块的go.mod文件进行手动修改,过程繁琐且容易出错。

"go.work"文件的主要作用就是来解决这些问题。它是一个特殊的文件,其中包含了use和replace指令,这些指令会覆盖工作区目录下的每个Go Module的go.mod文件中的内容。因此,开发者无需再对每个Go Module的go.mod文件进行手动修改,极大地简化了操作流程并提高了效率。

此外,"go.work"文件的优先级高于go.mod文件中的定义。也就是说,如果在go.work和go.mod中同时指定了不同的代码仓库路径,那么go.work中的设置将会被优先采用。这一特性进一步加强了"go.work"文件在依赖管理中的重要性。

小试一下go.work

当前工作目录下有 basehello 两个包含go.mod的工程,使用 go work init 命令可以初始化一个工作空间

alberts@home-pc:/mnt/g/wlsworkspace$ ls
base  hello
alberts@home-pc:/mnt/g/wlsworkspace$ go work init base hello
alberts@home-pc:/mnt/g/wlsworkspace$ cat go.work
go 1.19use (./base./hello
)

初始化之后工程之间就可以相互引用彼此对外的包内容了

总结

  • 下载go压缩包 wget https://golang.google.cn/dl/go1.19.linux-amd64.tar.gz
  • 初始化工程目录hello go mod init github.com/alberts/go/hello,包名通常是支持https访问的网络地址
  • 初始化工作空间 go work init base hello,base 和 hello 都是包含go.mod文件的go工程
  • 安装依赖包 go get -v golang.org/x/tools/gopls
  • 安装依赖包 github.com/stamblerre/gocode
  • 安装依赖包 github.com/uudashr/gopkgs/v2/cmd/gopkgs
  • 安装依赖包 github.com/ramya-rao-a/go-outline

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

放下助人情节,尊重他人命运~

相关文章:

  • HCIA vlan练习
  • Maven排除依赖 exclusions
  • 带大家做一个,易上手的家常葱爆牛肉
  • MacOS受欢迎的数据库开发工具 Navicat Premium 15 中文版
  • 二进制部署高可用k8s集群V1.20.11版本
  • nginx 搭建docker 似有hub仓库
  • SqlAlchemy使用教程(五) ORM API 编程入门
  • MetaGPT-打卡-day2,MetaGPT框架组件学习
  • 网络安全概述
  • 旧路由重置新路由设置新路由设置教程|适用于自动获取IP模式
  • C#调用Newtonsoft.Json将bool序列化为int
  • HttpServletRequest getHeader、getHeaders、getIntHeader、getDateHeader区别
  • EMI兼容测试方案——匹配不同测试标准,准确高效!
  • STM32-串口解析框架
  • 使用Nginx和Fancyindex组合搭建文件下载站点详细教程
  • CSS 提示工具(Tooltip)
  • ESLint简单操作
  • IDEA常用插件整理
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Linux后台研发超实用命令总结
  • maya建模与骨骼动画快速实现人工鱼
  • Meteor的表单提交:Form
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vue小说阅读器(仿追书神器)
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从重复到重用
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 蓝海存储开关机注意事项总结
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 阿里云服务器如何修改远程端口?
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (1)常见O(n^2)排序算法解析
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (10)STL算法之搜索(二) 二分查找
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (poj1.2.1)1970(筛选法模拟)
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (剑指Offer)面试题34:丑数
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十) 初识 Docker file
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 回调、接口回调、 委托
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET基础篇——反射的奥妙
  • .sdf和.msp文件读取
  • @Autowired 与@Resource的区别
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @font-face 用字体画图标
  • @GetMapping和@RequestMapping的区别