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

news2024/11/20 12:41:29

文章目录

  • 前言
  • 搭建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 31s

2024-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 main

import "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.
  gopkgs
  go-outline
  dlv
  dlv-dap
  staticcheck
  gopls

Installing 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) SUCCEEDED

All 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.19

use (
        ./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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1402068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[IPv6]常用的几种IPv4和IPv6地址格式

记录一下常用的IPv4和IPv6地址格式 IPv4 IPv4地址是32位的&#xff0c;通常表示为“192.168.1.12”这样点分成4段的形式。 一个IP地址可以分为两部分&#xff0c;网络ID和主机ID。如何区分哪些位是网络ID&#xff0c;哪些位是主机ID&#xff0c;就需要子网掩码。 子网掩码 …

利用STM32CubeMX和keil模拟器,3天入门FreeRTOS(1.1) —— 创建多个静态任务实操和简单讲解

前言 &#xff08;1&#xff09;FreeRTOS是我一天过完的&#xff0c;由此回忆并且记录一下。个人认为&#xff0c;如果只是入门&#xff0c;利用STM32CubeMX是一个非常好的选择。学习完本系列课程之后&#xff0c;再去学习网上的一些其他课程也许会简单很多。 &#xff08;2&am…

基于LSTM的负荷预测,基于BILSTM的负荷预测,基于GRU的负荷预测,基于BIGRU的负荷预测,基于BP神经网络的负荷预测

目录 背影 摘要 代码和数据下载&#xff1a;基于LSTM的负荷预测&#xff0c;基于BILSTM的负荷预测&#xff0c;基于GRU的负荷预测&#xff0c;基于BIGRU的负荷预测&#xff0c;基于BP神经网络的负荷预测资源-CSDN文库 https://download.csdn.net/download/abc991835105/8876806…

HCIA——22DNS:DNS层次域名空间、域名服务器、域名解析的原理

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

YOLOv8改进 | 主干篇 | 低照度图像增强网络SCINet改进黑暗目标检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是低照度图像增强网络SCINet,SCINet(自校正照明网络)是一种专为低光照图像增强设计的框架。它通过级联照明学习过程和权重共享机制来处理图像,优化了照明部分以提升图像质量。我将该网络集成在YOLOv8的主干上针对于图像的输入进行增…

以太坊账户地址与比特B地址生成方法对比

作者 张群&#xff08;赛联区块链教育首席讲师&#xff0c;工信部赛迪特聘资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09;关注张群&#xff0c;为您提供一站式区块链技术和方案咨询。 以太坊和比特B地址在生成方…

关于js的BigInt的使用与注意事项

说明 BigInt是一种内置对象&#xff0c;提供了一种方法来表示大于2^53 - 1 的整数&#xff0c;2^53 - 1 为Number可以表示的最大数字&#xff0c;BigInt可以突破限制&#xff0c;可以用任意精度表示整数&#xff0c;超出Number的安全整数限制&#xff0c;也可以安全地存储和操…

【AI】小白入门笔记

前言 2024年&#xff0c;愿新年胜旧年&#xff01;作为AI世界的小白&#xff0c;今天先来从一些概念讲起&#xff0c;希望路过的朋友们多多指教&#xff01; 正文 AI (人工智能) 提起AI, 大家可能会想起各种机器人&#xff0c;移动手机的“Siri”,"小爱同学", 是语…

GIS项目实战08:JetBrains IntelliJ IDEA 2022 激活

为什么选择 IntelliJ IDEA 使用编码辅助功能更快地编写高质量代码&#xff0c;这些功能可在您键入时搜索可能的错误并提供改进建议&#xff0c;同时无缝地向您介绍编码、新语言功能等方面的社区最佳实践。 IntelliJ IDEA 了解您的代码&#xff0c;并利用这些知识通过在每种上…

[java基础揉碎]位运算符

java中有7个位运算&#xff08;&、|、^、~、>>、<<和>>>&#xff09; 第一组 分别是按位与&、按位或|、按位异或^&#xff0c;按位取反~&#xff0c;它们的运算规则是&#xff1a; 按位与& : 两位全为1&#xff0c;结果为1&#xff0c;否则…

Debian11下编译ADAravis和Motor模块的一条龙过程

Debian11编译EPICS ADAravis记录 一年前整理的上面文&#xff0c;这几天重新走了一遍&#xff0c;有些地方会碰到问题&#xff0c;需要补充些环节&#xff0c;motor模块以前和areaDetector一条龙编译时&#xff0c;总是有问题&#xff0c;当时就没尝试了&#xff0c;这几天尝试…

生成当天递增唯一的流水号的几种方式

说明&#xff1a;当开发中&#xff0c;如交易、文件传输过程中的文件名&#xff0c;可能需要我们使用一串唯一的数字来锁定这一条“交互记录”&#xff0c;即流水号。 本文介绍几种生成6位递增唯一&#xff0c;且每日重置的流水号的方式。 方式一&#xff1a;使用Redis 我们…

OpenCompass 大模型评测

OpenCompass 大模型评测 关于测评的三个问题为什么需要测评&#xff1f;我们需要评测什么&#xff1f;怎么测试大预言模型&#xff1f; 主流大模型评测框架OpenCompass能力框架OpenCompass评测流水线设计 随着人工智能技术的快速发展&#xff0c; 大规模预训练自然语言模型成为…

3.RHCSA脚本配置及通过node2改密码

运行脚本发现node2不成功 脚本破解 选第二个 Ctrl x 换行 破解成功后做node2的改密码题 回到redhat, 发现检测程序检测密码题成功,得了8分.

《WebKit 技术内幕》之八(1):硬件加速机制

《WebKit 技术内幕》之八&#xff08;1&#xff09;&#xff1a;硬件加速机制 1 硬件加速基础 1.1 概念 这里说的硬件加速技术是指使用GPU的硬件能力来帮助渲染网页&#xff0c;因为GPU的作用主要是用来绘制3D图形并且性能特别好&#xff0c;这是它的专长所在&#xff0c;它…

Spring Boot 集成 API 文档 - Swagger、Knife4J、Smart-Doc

文章目录 1.OpenAPI 规范2.Swagger: 接口管理的利器3.Swagger 与 SpringFox&#xff1a;理念与实现4.Swagger 与 Knife4J&#xff1a;增强与创新5.案例&#xff1a;Spring Boot 整合 Swagger35.1 引入 Swagger3 依赖包5.2 优化路径匹配策略兼容 SpringFox5.3 配置 Swagger5.4 S…

快速转换,让图片瞬间变成Excel表格!

摘要&#xff1a;本文将带你探索将图片转换为Excel表格的可行性和方法。通过对一些流行的数据处理软件进行测试&#xff0c;我们发现Photoshop和Excel可以轻松地将图片转换为Excel表格。此外&#xff0c;我们还比较了不同软件之间的差异&#xff0c;并提供了一些建议&#xff0…

docker搭建hbase 全部流程(包含本地API访问)

一、使用docker下载并安装hbase 1、搜索&#xff1a;docker search hbase 2、下载&#xff1a;docker pull harisekhon/hbase&#xff08;一定要下载这个&#xff0c;下面都是围绕此展开的&#xff09; 3、启动容器&#xff1a; docker run -d -p 2181:2181 -p 16000:16000…

做一个简单的倒计时

<div>距离过年还有:<span></span></div><script>let div document.querySelector("div");let span document.querySelector("span");// 获取未来时间戳let future new Date("2024-2-10 00:00:00");// 获取当下…

Midjourney V6有多厉害,看完这27张图你就明白了!

一些结论 当前V6版本仍处于Alpha测试阶段&#xff1a;这意味着产品的某些方面可能会发生变化。 更准确地遵循提示指令&#xff1a;V6在遵循用户的提示指令方面更为准确&#xff0c;特别是对于较长的提示指令。 模型更加连贯&#xff1a;新版本的模型在生成图像时展现出更高的…