一个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

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

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

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

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

相关文章

flask 与 小程序 购物车 展示功能

mina/pages/cart/index.wxml <!--index.wxml--> <view class"container"><view class"title-box" wx:if"{{ !list.length }}">购物车空空如也&#xff5e;</view><view class"to-index-btn" bindtap"…

Flutter 综述

Flutter 综述 1 介绍1.1 概述1.2 重要节点1.3 移动开发中三种跨平台框架技术对比1.4 flutter 技术栈1.5 IDE1.6 Dart 语言1.7 应用1.8 框架 2 Flutter的主要组成部分3 资料书籍 《Flutter实战第二版》Dart 语言官网Flutter中文开发者社区flutter 官网 4 搭建Flutter开发环境参考…

【漏洞复现】CloudPanel makefile接口远程命令执行漏洞(CVE-2023-35885)

文章目录 前言声明一、CloudPanel 简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 CloudPanel 是一个基于 Web 的控制面板或管理界面&#xff0c;旨在简化云托管环境的管理。它提供了一个集中式平台&#xff0c;用于管理云基础架构的各个方面&#xff0c;包括 &a…

nginx基于IP的多虚拟主机

结合这篇文章一起&#xff1a;nginx虚拟主机-CSDN博客文章浏览阅读63次。虚拟主机指的就是一个独立的站点配置&#xff0c;是nginx默认支持的一个功能&#xff0c;它能够有自己独立的域名&#xff0c;独立的ip&#xff0c;独立的端口配置&#xff0c;能够配置完整的www服务&…

ubuntu安装vm和Linux,安装python环境,docker和部署项目(一篇从零到部署)

1、下载Ubuntu Index of /releaseshttps://old-releases.ubuntu.com/releases/ 2、下载VMware 官方正版VMware下载&#xff08;16 pro&#xff09;&#xff1a;https://www.aliyundrive.com/s/wF66w8kW9ac 下载Linux系统镜像&#xff08;阿里云盘不限速&#xff09;&#xff…

JavaScript 学习笔记(WEB APIs Day2)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. JavaScript 学习笔记&#xff08;Day1&#xff09; 2. JavaSc…

【概率统计】区间估计 假设检验公式汇总

区间估计 假设检验公式汇总 最简单的一集

爬虫逆向开发教程1-介绍,入门案例

爬虫前景 在互联网的世界里&#xff0c;数据就是新时代的“黄金”。而爬虫&#xff0c;就是帮助我们淘金的“工具”。随着互联网的不断发展&#xff0c;数据量呈现指数级的增长&#xff0c;在数据为王的时代&#xff0c;有效的挖掘数据和利用&#xff0c;你会得到更多东西。 学…

SqlAlchemy使用教程(五) ORM API 编程入门

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用SqlAlchemy使用教程(五) ORM API 编程入门 前一章用SQL表达式(SQL Expr…

用于垃圾回收的运行时配置选项

反馈 本文内容 指定配置的方法垃圾回收的风格管理资源使用情况大型页面 显示另外 4 个 此页面包含有关 .NET 运行时垃圾回收器 (GC) 设置的信息。 如果你要尝试让正在运行的应用达到最佳性能&#xff0c;请考虑使用这些设置。 然而&#xff0c;在特定情况下&#xff0c;默认…

基于大整形的运算收录

目录 目录 目录 前言 为什么要大整数 大整形的加/减法 大整形的乘法 大整形除法 大整形开方 代码实现 前言 好久没有更新博客了&#xff0c;hhh。时隔三个月&#xff0c;我又回来了。先来点简单的大整形&#xff0c;虽说简单&#xff0c;但是在编写的时候还是debug了…

学校门禁管理技巧,一招轻松学会!

随着社会的不断发展和科技的不断进步&#xff0c;安全管理成为各个领域至关重要的议题之一。门禁监控系统作为现代安全管理的关键组成部分&#xff0c;不仅为建筑物提供了有效的访问控制&#xff0c;还在提高整体安全性和管理效率方面发挥了关键作用。 客户案例 公司办公楼门禁…

php no input file specified

一、修改 .user.ini 文件 内容 open_basedir/wab/led-sportslight.com/:/tmp/ led-sportslight.com是项目根目录位置 改好后保存并清空缓存硬刷新网站就行了 二、mkdir(): Permission denied /core/library/think/cache/driver/File.php 第 84 行左右 mkdir(): Permission de…

2024最新最全【网络安全面试题含答案】(非常详细),零基础入门到精通

防范常见的 Web 攻击 什么是SQL注入攻击 攻击者在HTTP请求中注入恶意的SQL代码&#xff0c;服务器使用参数构建数据库SQL命令时&#xff0c;恶意SQL被一起构造&#xff0c;并在数据库中执行。 用户登录&#xff0c;输入用户名 lianggzone&#xff0c;密码 ‘ or ‘1’’1 &a…

使用 OpenCV 添加(混合)两个图像

目标 在本教程中&#xff0c;您将学习&#xff1a; 什么是线性混合以及为什么它有用;如何使用 addWeighted&#xff08;&#xff09; 添加两个图像 理论 注意 下面的解释属于Richard Szeliski的《计算机视觉&#xff1a;算法和应用》一书 从我们之前的教程中&#xff0c;…

LabVIEW扫描探针显微镜系统开发

在纳米技术对高精度材料特性测量的需求日益增长。介绍了基于LabVIEW开发的扫描探针显微镜&#xff08;SPM&#xff09;系统。该系统不仅可以高效地测量材料的热物性&#xff0c;还能在纳米尺度上探究热电性质&#xff0c;为材料研究提供了强大的工具。 系统基于扫描探针显微技…

(2)(2.1) Andruav Android Cellular(二)

文章目录 前言 5 Andruav Web Client 6 Andruav Telemetry 7 Andruav高级功能 8 将Andruav与SITL配合使用 9 FAQ 10 术语表 前言 Andruav 是一个基于安卓的互联系统&#xff0c;它将安卓手机作为公司计算机&#xff0c;为你的无人机和遥控车增添先进功能。 5 Andruav W…

数学建模--PageRank算法的Python实现

文章目录 1. P a g e R a n k PageRank PageRank算法背景2. P a g e R a n k PageRank PageRank算法基础2.1. P a g e R a n k PageRank PageRank问题描述2.2.有向图模型2.3.随机游走模型 3. P a g e R a n k PageRank PageRank算法定义3.1. P a g e R a n k PageRank PageRank…

GD32接收不定长数据包

接收不定长数据 Cubemx生成代码过程忽略 首先在main函数中创建接收缓存区 并在main.h中定义 接下来就是重写串口的中断函数中的内容&#xff0c;把原有内容注释掉 main中创建一个记录接收数据长度的变量和标志位 然后再在主函数中添加一个验证代码&#xff0c;这样MCU收到数据…

Cesium叠加超图二维服务、三维场景模型

前言 Cesium作为开源的库要加超图的服务则需要适配层去桥接超图与Cesium的数据格式。这个工作iClient系列已经做好&#xff0c;相比用过超图二维的道友们可以理解&#xff1a;要用Openlayer加载超图二维&#xff0c;那就用iClient for Openlayer库去加载&#xff1b;同样的要用…