Go后端开发 -- 环境搭建

Go后端开发 – 环境搭建

文章目录

  • Go后端开发 -- 环境搭建
  • 一、环境配置
  • 二、IDE的选择
  • 三、使用go mod构建项目
    • 1.初始化项目
    • 2.添加依赖项
    • 3.运行项目
  • 四、环境报错
    • 1.VS Code中gopls报错


一、环境配置

Go官网下载地址:https://golang.org/dl/
https://go.dev/dl/
Go官方镜像站(推荐):https://golang.google.cn/dl/

以Linux版本为例:

  • 下载后,上传到Linux服务器中,解压到/usr/local路径中:
    sudo tar -zxvf go1.21.5.linux-amd64.tar.gz -C /usr/local/
    进入/usr/local路径,有一个go文件夹:
    在这里插入图片描述
    进入该文件夹
    在这里插入图片描述
    其中src目录下是go的源码
    在这里插入图片描述
    进入bin目录
    在这里插入图片描述
    有两个指令,go是go语言的编译环境,我们需要将当前路径配置到系统环境变量中;

  • 配置环境变量:
    回到家目录下,打开默认配置文件:
    在这里插入图片描述
    加入以下环境变量:
    export GOROOT="/usr/local/go" export GOPATH=$HOME/go export GOBIN=$GOROOT/bin export PATH=$PATH:$GOBIN
    在这里插入图片描述
    GOROOT:go语言的源码包所在的路径;
    GOPATH:go语言的工作路径,可以自定义;
    GOBIN:go语言源码编译环境路径;
    PATH:配置系统环境变量;

    配置完后,保存并加载一下:
    在这里插入图片描述
    检查版本,验证环境配置是否成功:
    在这里插入图片描述
    go --help指令能够查看当前有哪些指令可以使用:
    在这里插入图片描述

  • 配置GOPATH:
    gopath就是go项目代码存放的位置,可以自定义,该目录下有三个子目录:src,pkg, bin;

    • src:里面的每一个子目录,就是一个包,包内是go的源码文件
    • pkg:编译后生成的,包的目标文件
    • bin:生成的可执行文件
      在这里插入图片描述
  • GOPROXY
    Go1.14版本之后,都推荐使用go mod模式来管理依赖了,也不再强制我们把代码必须写在GOPATH下面的src目录了,你可以在你电脑的任意位置编写go代码。
    默认GoPROXY配置是:GOPROXY=https://proxy.golang.org,direct,
    由于国内访问不到 https://proxy.golang.org 所以我们需要换一个PROXY,这里推荐使用https://goproxy.iohttps://goproxy.cn
    可以执行下面的命令修改GOPROXY:

go env -w GOPROXY=https://goproxy.cn,direct

Go 1.11 版本推出modules机制,简称 mod,更加易于管理项目中所需要的模块。模块是存储在文件树中的 Go 包的集合,其根目录中包含 go.mod 文件。 go.mod 文件定义了模块的模块路径,它也是用于根目录的导入路径,以及它的依赖性要求。每个依赖性要求都被写为模块路径和特定语义版本。
从 Go 1.11 开始,Go 允许在$GOPATH/src的任何目录下使用 go.mod 创建项目。在 $GOPATH/src 中,为了兼容性,Go 命令仍然在旧的 GOPATH 模式下运行。从 Go 1.13 开始,go.mod模式将成为默认模式。
Go Modules 在 Go 1.11 及 Go 1.12 中有三个模式,根据环境变量 GO111MODULE 定义:

  • 默认模式(未设置该环境变量或 GO111MODULE=auto

    1. 当前目录不在 GOPATH/src/ 下;
    2. 在当前目录或上层目录中存在 go.mod 文件;
  • GOPATH 模式(GO111MODULE=off
    Go 命令行工具从不使用 Go Modules。相反,它查找 vendor 目录和 GOPATH 以查找依赖项。

  • Go Modules 模式( GO111MODULE=on
    Go 命令行工具只使用 Go Modules,GOPATH不再作为导入目录,但它还是会把下载的依赖储存在 GOPATH/pkg/mod 中,也会把 goinstall的结果放在 GOPATH/bin 中,只移除了 GOPATH/src/
    如果 GO111MODULE 没有显式设置,那么默认为 on。如果 go env 查出来的环境变量 GO111MODULE 为空,那么 go 编译器默认 GO111module 为 on。

Go modules 的使用:

# 临时开启 Go modules 功能
export GO111MODULE=on
# 永久开启 Go modules 功能
go env -w GO111MODULE=on# 设置 Go 的国内代理,方便下载第三方包
go env -w GOPROXY=https://goproxy.cn,direct

如果设置失败,可以直接修改~/.bashrc配置文件:
在这里插入图片描述
逗号后面可以增加多个 proxy,最后的 direct 则是在所有 proxy 都找不到的时候,直接访问,代理访问不到的私有仓库就可以正常使用了。
其它代理请参考:
https://www.cnblogs.com/feiquan/p/13357971.html
https://studygolang.com/articles/23599?fr=sidebar
最后通过env查看:
在这里插入图片描述

二、IDE的选择

目前go开发的主流IDE有GoLand和VS Code,下面以VS Code为例,实现go的开发环境配置;

  • 使用VS Code插件remote SSH远程连接Linux云服务器:
    在这里插入图片描述
  • 安装插件:
    在这里插入图片描述
  • 配置GOPROXY和Go Module:
    Go1.14版本之后均使用go mod来管理依赖环境
sudo go env -w GOPROXY=https://goproxy.cn,direct
sudo go env -w GO111MODULE=on

三、使用go mod构建项目

1.初始化项目

我们使用了go mod模块,就可以在$GOPATH以外的目录创建项目,然后初始化 go mod init project_name,成功之后会发现目录下会生成一个 go.mod 文件。
在这里插入图片描述
在这里插入图片描述
查看内容
在这里插入图片描述
go.mod 文件只存在于模块的根目录中模块子目录的代码包的导入路径等于模块根目录的导入路径(就是前面说的 module path)加上子目录的相对路径。

比如,我们如果创建了一个子目录叫 common,我们不需要(也不会想要)在子目录里面再运行一次 go mod init 了,这个代码包会被认为就是 go_test 模块的一部分,而这个代码包的导入路径就是 go_test/common

2.添加依赖项

在 go_test 文件夹下创建main.go并添加以下内容

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "pong",})})r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

执行 go build main.go 之后会自动下载三方包到默认的目录 $GOPATH/pkg/mod,也就是 Mod Cache 路径;
在这里插入图片描述
进入$GOPATH/pkg/mod目录查看
在这里插入图片描述
查看go.mod文件和go.sum文件:
在这里插入图片描述

  • module 表示模块名称
  • require 依赖包列表以及版本
    一般来说,require () 是不需要自己手动去修改的,当运行代码的时候,会根据代码中用到的包自动去下载导入
  • exclude 禁止依赖包列表,不下载和引用哪些包(仅在当前模块为主模块时生效)
  • replace 替换依赖包列表和引用路径(仅在当前模块为主模块时生效)
    replace 对于国内开发来说是个神功能,他可以将代码中使用,但国内被墙的代码替换成 github上的下载路径,例如:golang.org/x/ 下的包,全都替换成 github地址上的包,版本使用 latest 即可。
    replace 指令可以将依赖的模块替换为另一个模块,例如由公共库替换为内部私有仓库。
replace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5replace (golang.org/x/net => github.com/golang/net latestgolang.org/x/tools => github.com/golang/tools latestgolang.org/x/crypto => github.com/golang/crypto latestgolang.org/x/sys => github.com/golang/sys latestgolang.org/x/text => github.com/golang/text latestgolang.org/x/sync => github.com/golang/sync latest
)

indirect 表示这个库是间接引用进来的。
使用 go list -m all 可以查看到所有依赖列表,也可以使用 go list -json -m all 输出 json格式的打印结果。

除了 go.mod 之外,go 命令行工具还维护了一个 go.sum 文件,它包含了指定的模块的版本内容的哈希值作为校验参考:
在这里插入图片描述
go 命令行工具使用 go.sum 文件来确保你的项目依赖的模块不会发生变化——无论是恶意的,还是意外的,或者是其它的什么原因。go.mod 文件和 go.sum 文件都应该保存到你的代码版本控制系统里面去。

go.sum 这个文件记录了源码的直接依赖和间接依赖包的相关版本的 hash 值,用来校验本地包的真实性。在构建的时候,如果本地依赖包的 hash 值与 go.sum 文件中记录的不一致,就会被拒绝构建,这样可以确保你的项目所依赖的 module 内容,不会被恶意或意外篡改。

3.运行项目

  • 编译代码:
    go build main.go
    在这里插入图片描述
  • 运行代码:
    go run main.go
    在这里插入图片描述

四、环境报错

1.VS Code中gopls报错

显示gopls was not able to find modules in your workspace,这种报错的原因是,使用VS Code打开的远程目录当做workspace,但是由于go mod机制,源码不在$GOPATH中,需要使用go mod init来初始化项目,而初始化形成的go.mod文件不在workspace目录下,而在其子目录下,导致gopls寻找modules错误;
在这里插入图片描述
解决方案是使用go work机制,即多模块工作区机制(要把哪些mod纳入到你的工作区内);
vscode打开的文件夹的路径默认作为了其工作区(workspace),而这个工作区的根目录要有go.mod文件,如果根目录没有这个go.mod就要指定哪些子目录的go mod纳入工作区
go work init
go work use 需要纳入工作区的子目录
在这里插入图片描述
在这里插入图片描述
这样gopls就不会报错了;
也可以选择VS Code直接打开项目目录作为workspace,但这样比较不方便;

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

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

相关文章

JavaWeb笔记之前端开发JQuery

一、引言 1.1 概述 jQuery是一个快速、简洁的JavaScript代码库。jQuery设计的宗旨是“Write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的 JavaScript操作方式&#xff0c…

Sass:提升CSS开发效率的利器

Sass:提升CSS开发效率的利器 导语:在Web开发中,样式表是不可或缺的一部分。然而,纯CSS编写繁琐且冗长,难以维护和管理。为了解决这些问题,CSS预处理器应运而生,而其中最为知名和强大的就是Sass…

麒麟V10 ARM 离线生成RabbitMQ docker镜像并上传Harbor私有仓库

第一步在外网主机执行: docker pull arm64v8/rabbitmq:3.8.9-management 将下载的镜像打包给离线主机集群使用 在指定目录下执行打包命令: 执行: docker save -o rabbitmq_arm3.8.9.tar arm64v8/rabbitmq:3.8.9-management 如果懒得打包…

Spring + SpringBoot史上最全的注解说明

Spring中的注解 Spring中的注解大概可以分为两大类: spring的bean容器相关的注解,或者说bean工厂相关的注解;springmvc相关的注解。 spring的bean容器相关的注解,先后有:Required, Autowired, PostConst…

国产低成本Wi-Fi SoC解决方案芯片ESP8266与ESP8285对比差异

目录 ESP8266与ESP8285对比差异微信号:dnsj5343ESP8285简介ESP8285 主要特性Wi-Fi特性射频模块CPU特性硬件软件 ES8285 8266通用开发板 ESP8266与ESP8285对比差异 ESP8285相当于在ESP8266基础上多加了1/2MB Flash, ESP8285与ESP8266同用一套SDK&#xf…

落叶归根:递归思想在二叉树叶子节点类问题中的妙用

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《linux深造日志》 《高效算法》 ⛺️生活的理想,就是为了理想的生活! 文章目录 一、递归的介绍二、递归算法的妙用2.1 二叉树结点个数2.2 二叉树叶子结点个数2.3 二叉树第k层结点个数2.4 二叉树…

一些CSS的笔记

1.margin margin:0 auto 是指上下的值为0,左右的值为auto; margin:auto是指上右下左的值全都auto,即都是自适应的; margin:0; 这个是上右下左的值都为0; 2.vertical-align vertical-align 属性设置元素的垂直对齐方式。…

基于比较的排序算法总结(java实现版)

目录 什么是基于比较的排序算法 什么是排序算法的稳定性 基础排序算法的稳定性 插入排序法 希尔排序法 冒泡排序法 总结 高级算法的稳定性 快速排序法 堆排序法 归并排序法 总结 注意 什么是基于比较的排序算法 基于比较的排序算法定义:之所以能给元素…

安装gnvm,nodejs,npm使用方法

安装gnvm,nodejs,npm使用方法 一、安装gnvm gnvm.exe下载地址: https://download.csdn.net/download/hsg77/88651752 http://ksria.com/gnvm/#download 二、配置gnvm环境变量 新建目录,如:d:/nodejs 并把gnvm.exe存储到此目录 并把d:/node…

【MATLAB第85期】基于MATLAB的2023年智能进化算法/元启发式算法合集(持续更新)

【MATLAB第85期】基于MATLAB的2023年智能进化算法/元启发式算法合集(持续更新) 1.海象进化算法(Walrus Optimization Algorithm) 作者:Pavel Trojovsk and Mohammad Dehghani 2.暴龙优化算法(Tyrannosa…

安卓13上手势导航失效、手机卡死问题

问题描述&#xff1a;打开我们开发的app后&#xff0c;手势导航无法退回、无法回到桌面、无法切换应用。 使用设备&#xff1a;小米手机、MI14,、安卓13 未适配安卓13安卓x的情况下&#xff0c;检查自己的 AndroidManifest 文件&#xff0c;过滤器是否设置了 <category a…

apache poi_5.2.5 实现表格内某一段单元格的复制

apache poi_5.2.5 实现表格内&#xff0c;某一段单元格的复制。 实现思路 1.定位开始位置 2.从开始位置之后&#xff0c;在行索引集合中添加行索引下标 3.截至到结束位置。 4.对行索引集合去重&#xff0c;并循环行索引集合 5.利用XWPFTableRow对像的getCtRow().copy()方法&a…

什么是伦敦金的假突破?假突破为何有效?

部分投资者做伦敦金交易的时候喜欢追逐那些强势的行情&#xff0c;也就是我们所说的突破行情。但是突破行情会带来两种结果&#xff0c;一种是突破成功&#xff0c;而另一种是出现假突破。什么是伦敦金中的假突破呢&#xff1f;为什么假突破会有效呢&#xff1f;下面我们就来讨…

Python自动化测试(超详细总结)

Python自动化测试常用于Web应用、移动应用、桌面应用等的测试 Python自动化实现思路通常分为以下几步&#xff1a; 1. 确定自动化测试的范围和目标&#xff1a; 首先需要明确需要进行自动化测试的范围和目标&#xff0c;包括测试场景、测试用例、测试数据等。 2. 选择自动化…

考研数学二内容总结

目录 高等数学 一、函数、极限、连续 考试内容 &#x1f3c1;总结&#xff1a; 考试要求 &#x1f3c1;1&#xff0e;理解函数的概念&#xff0c;掌握函数的表示法&#xff0c;会建立应用问题的函数关系&#xff0e; 2&#xff0e;了解函数的有界性、单调性、周期性和奇…

el-tree lazy懒加载(进阶版)

2023.12.22今天我学习了el-tree如何实现懒加载&#xff0c;效果如&#xff1a; 代码如下&#xff1a; 懒加载的使用不需要用:data <template><div><el-tree:props"props":load"loadNode"lazynode-key"id"show-checkbox/><…

寒冬送温暖||关爱山东省济宁市泗水县残疾人孤寡老人暖冬行

倡导扶残助弱的社会风尚&#xff0c;共建和谐美好的社会&#xff0c;保障山区残疾人、孤寡老人特殊群体度过一个安全、温暖的寒冬。12月19日&#xff0c;潍坊市金阳公益服务中心 、济宁市泗水县残疾人联合会、山东金琉通国际文化交流有限公司志愿站 在潍坊市社会组织培育中心举…

uniapp 添加分包页面,配置分包预下载

为什么要分包 ? 分包即将小程序代码分成多个部分打包&#xff0c;可以减少小程序的加载时间&#xff0c;提升用户体验 添加分包页面 比较便捷的方法是使用vscode插件 uni-create-view 新建分包文件夹 以在我的页面&#xff0c;添加分包的设置页面为例&#xff0c;新建文件夹 s…

python:删除空白

删除字符串末尾的空白 例如&#xff0c;下面的代码&#xff0c;变量hobby指向的字符串在末尾有一个空格&#xff1a; 可以使用函数rstrip()删除字符串末尾的空格&#xff0c;如下&#xff1a; 因为删除字符串末尾的空格并没有赋值给原变量hobby&#xff0c;所以此时查看hobb…

PDF文件如何设置限制打印?

想要限制PDF文件的打印功能&#xff0c;想要限制PDF文件打印清晰度&#xff0c;都可以通过设置限制编辑来达到目的。 打开PDF编辑器&#xff0c;找到设置限制编辑的界面&#xff0c;切换到加密状态&#xff0c;然后我们就看到 有印刷许可。勾选【权限密码】输入一个PDF密码&am…