手把手教你基于gin从零搭建一个属于你自己的go项目(一)
一、为什么写这个,适合什么人看
原因
因为自己想写点小玩意,本来是打算用egg.js来写服务端的,后来发现了个更好玩的midway,但是后来发现自己手上的服务器都是一核2g的小水管,用node有点难顶,于是乎决定用其他技术栈来解决问题,在kotlin和go中初步调研之后发现go更符合自己的需求,于是乎就有了这个系列的笔记输出。
适合食用人群
- 对go技术栈或者后端的套路没有什么了解的小白
- 想搞点小玩意的前端同学
- node已经不满足欲望的前端同学
- 想要学习一下从0搭建一个项目的新手同学
不适合食用人群
- 无编程基础纯小白
- go大佬
- 后端大佬
预期内容
大概会有十来篇,打算写成一个适合自己用的通用模版,后期可快速进行crud。
当前发的内容都只是初始版本,等所有内容写完后会进行精修和增删,以便更好食用。
仅限于单体应用,想搞微服务可以了解一下b站开源的kratos框架或者istio
二、如何安装go
(1) 下载
1、下载go是一件非常简单的事情,如果是windows或mac,我们可以直接去官网下载自己需要的版本,然后按指引安装就可以了。
官网地址:golang.org/dl/
(2) 配置环境变量
1、windows
1.1 系统变量
安装完成后,在系统变量的Path一栏,会自动配置Go语言的GOROOT变量,值为C:\Go\bin。一般情况下,系统变量不需要修改。
1.2 用户变量
在用户变量一栏,会自动配置一个GOPATH变量,默认值为%USERPROFILE%\go,而且在用户变量的Path里会自动配置%USERPROFILE%\bin。这个GOPATH就是我们的工作目录,如果你不希望使用默认路径,可以将其进行修改,例如:
- 创建自己想要的目录,并在此目录下,创建三个子文件夹,分别为bin、pkg、src
- 编辑GOPATH,将%USERPROFILE%\go值改为自定义的目录
- 编辑用户变量的Path,将%USERPROFILE%\bin修改为%GOPATH%\bin。
2、MAC
1.1 bash
打开 .bash_profile,我们可以在终端输入open ~/.bash_profile 或者 vim ~/.bash_profile 对该文件进行编辑
添加配置,在配置文件末尾添加
export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=����:PATH:GOBIN
最后 source ~/.bash_profile 重载配置
使用go env查看是否修改
2.2 zsh
mac的默认shell是zsh,所以修改bash的配置文件还是不够的,这时候我们就要根据上面的操作打开zsh的配置文件再来一次
打开 .zshrc,我们可以在终端输入open ~/.zshrc 或者 vim ~/.zshrc 对该文件进行编辑
添加配置,在配置文件末尾添加
ini
复制代码
export GOPATH=$HOME/go export GOBIN=$GOPATH/bin export PATH=$PATH:$GOBIN
最后 source ~/.zshrc 重载配置
使用go env查看是否修改
3、更改Go镜像,启用go mod
ini
复制代码
go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct
3.1 什么是go.mod? Go.mod是Golang1.11版本新引入的官方包管理工具用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理。
Go.mod其实就是一个Modules,关于Modules的官方定义为:
Modules是相关Go包的集合,是源代码交换和版本控制的单元。go命令直接支持使用Modules,包括记录和解析对其他模块的依赖性。Modules替换旧的基于GOPATH的方法,来指定使用哪些源文件。
Modules和传统的GOPATH不同,不需要包含例如src,bin这样的子目录,一个源代码目录甚至是空目录都可以作为Modules,只要其中包含有go.mod文件。
3.2 GO111MODULE 参数
GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
(1) 当前目录在GOPATH/src之外且该目录包含go.mod文件 (2) 当前文件在包含go.mod文件的目录下面。
**注:**修改 GO111MODULE 参数可以用 go env -w GO111MODULE=on
3.3 如何在项目中使用 go.mod ?
1.新建项目,在GOPATH/src 目录之外
go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。go toolchain会在各类命令执行时,比如go get、go build、go mod等修改和维护go.mod文件。
go.mod 文件内提供了module, require、replace和exclude四个关键字
module
语句指定包的名字(路径)require
语句指定的依赖项模块replace
语句可以替换依赖项模块exclude
语句可以忽略依赖项模块
2.在当前目录下,命令行运行 go mod init + 模块名称 来初始化模块
初始化之后,会在当前目录下生成一个go.mod文件,这是一个go用来管理包的关键文件
**注1:**为了确保一致性构建,Go引入了go.mod
文件来标记每个依赖包的版本,在构建过程中go
命令会下载go.mod
中的依赖包,下载的依赖包会缓存在本地,以便下次构建。 考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个go.mod
文件并不能保证一致性构建。
为了解决Go module的这一安全隐患,Go开发团队在引入go.mod
的同时也引入了go.sum
文件,用于记录每个依赖包的哈希值,在构建时,如果本地的依赖包hash值与go.sum
文件中记录得不一致,则会拒绝构建。
**注2:**go.sum 不需要手工维护,所以可以不用太关注。
**注3:**子目录里是不需要init的,所有的子目录里的依赖都会组织在根目录的go.mod文件里
**注4:**使用Go的包管理方式,依赖的第三方包被下载到了$GOPATH/pkg/mod路径下。
**注5:**版本是在go.mod中指定的。如果,在go.mod中没有指定,go命令会自动下载代码中的依赖的最新版本。如果,在go.mod用require语句指定包和版本 ,go命令会根据指定的路径和版本下载包,指定版本时可以用latest,这样它会自动下载指定包的最新版本;
注6: go mod init 模块名 生成的go.mod文件里的第一行会申明 module 模块名
作用:例如在项目下新建目录 utils,创建一个tools.go文件
在根目录下的hello.go文件就可以 import “hello/utils” 引用utils
go
复制代码
package main import ( "hello/utils" "github.com/astaxie/beego" ) func main() { utils.PrintText("Hi") }
3.4 go.mod 命令
- go mod download 下载模块到本地缓存,缓存路径是 $GOPATH/pkg/mod/cache
- go mod edit 是提供了命令版编辑 go.mod 的功能,例如 go mod edit -fmt go.mod 会格式化go.mod
- go mod graph 把模块之间的依赖图显示出来
- go mod init 初始化模块(例如把原本dep管理的依赖关系转换过来)
- go mod tidy 增加缺失的包,移除没用的包
- go mod vendor 把依赖拷贝到 vendor/ 目录下
- go mod verify 确认依赖关系
- go mod why 解释为什么需要包和模块
附 : go 相关命令
指定module的根目录并生成go.mod文件
go mod init example.com/hello
下载并添加依赖到go.mod文件中
go build, go test
查看module下的所有依赖
go list -m all
更新稳定版依赖
go get rsc.io/sampler
清理无用的依赖
go mod tidy
将依赖复制到项目路径的vendor文件夹中
go mod vendor
忽略cache里的包,只使用vendor目录里的依赖进行编译
go build -mod=vendor
校验依赖并查看是否有修改
go mod verify
**注1:**go mod 命令在 GOPATH里默认是执行不了的,因为GO111MODULE的默认值是auto。。默认在GOPATH里默认是执行不了的,因为GO111MODULE的默认值是auto。默认在GOPATH 里是不会执行, 如果一定要强制执行,就设置环境变量为 on。
**注2:**go mod init 在没有接module名字的时候是执行不了的,会报错 go: cannot determine module path for source directory。
三、初始化项目
(1) 新建项目目录及初始化
1、新建项目目录
首先,我们可以选择一个心仪的文件夹,在它下面新建一个项目目录,名字的话可以根据自己的喜好来选择,就如下图一样,我新建了一个名为 go_server的项目目录,此刻它的下面空空如也。
2、初始化项目
新建项目后我们要做的第一件事情就是初始化项目,新建go.mod 文件对项目中依赖进行管理,具体方法可以参考上面文档进行,我这里 执行了
go mod init myblog-server
生成了一个go.mod 文件
3、导入Gin框架
3.1 什么是Gin
Gin 是一个用 Go (Golang) 编写的 HTTP web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架, 优于 httprouter,速度提高了近 40 倍。(以上为官网描述)
3.2 使用前提
使用gin需要Go的版本号为1.6或更高
3.3 安装gin
go get -u github.com/gin-gonic/gin
执行完后正常来说你的文件夹里就会多出一个go.sum文件,它的作用在上面有所提及,不过一般情况下不太需要关注它,所以我们可以暂且略过
4、创建入口文件 main.go
4.1 在根目录下新建一个入口文件 main.go
并输入以下代码
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
S := gin.Default()
S.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{"msg": "服务启动成功"})
})
err := S.Run(":8080")
if err != nil {
fmt.Println("服务器启动失败!")
}
}
4.2 在根目录下使用 go run main.go 启动服务
这时候我们在浏览器中访问localhost:8080 或者 127.0.0.1:8080 就可以看到
手把手教你基于gin从零搭建一个属于你自己的go项目(一)的更多相关文章
- 基于Idea从零搭建一个最简单的vue项目
一.需要了解的基本知识 node.js Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.N ...
- 手把手教你从购买vps到搭建一个node服务器
要准备什么? 1.5刀 2.最好有FQ软件(可以用蓝灯) let's Go! 一.vps购买 vps可以选择digital ocean(do) 链接 ,由于是外国网站,响应比较慢,所以最好翻个墙. g ...
- Delphi - 手把手教你基于D7+Access常用管理系统架构的设计与实现 (更新中)
前言 从事软件开发工作好多年了,学的越深入越觉得自己无知,所以还是要对知识保持敬畏之心,活到老,学到老! 健身和代码一样都不能少,身体是革命的本钱,特别是我们这种高危工种,所以小伙伴们运动起来!有没有 ...
- 基于Gin+Gorm框架搭建MVC模式的Go语言后端系统
文/朱季谦 环境准备:安装Gin与Gorm 本文搭建准备环境:Gin+Gorm+MySql. Gin是Go语言的一套WEB框架,在学习一种陌生语言的陌生框架,最好的方式,就是用我们熟悉的思维去学.作为 ...
- 手把手教你Pytest+Allure2.X定制报告详细教程,给自己的项目量身打造一套测试报告-02(非常详细,非常实用)
简介 前边一篇文章是分享如何搭建pytest+Allure的环境,从而生成一份精美的.让人耳目一新的测试报告,但是有的小伙伴或者童鞋们可能会问,我能不能按照自己的想法为我的项目测试结果量身打造一份属于 ...
- 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权
OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...
- 从零搭建一个IdentityServer——会话管理与登出
在上一篇文章中我们介绍了单页应用是如何使用IdentityServer完成身份验证的,并且在讲到静默登录以及会话监听的时候都提到会话(Session)这一概念,会话指的是用户与系统之间交互过程,反过来 ...
- 从零搭建一个IdentityServer——资源与访问控制
IdentityServer作为授权服务器它的最终目的是用于对资源进行管控,这里所说的资源有两种,其一是API资源,实际上也就是OIDC协议中客户端(RP)所需要访问的一系列受保护的资源(API),授 ...
- 手把手教你用Vue2+webpack+node开发一个H5 app
手把手教你用Vue2+webpack+node开发一个H5 app 前一篇vue2 + webpack + node 开发一个小demo说到了用vue的一些基本用法,这一篇就讲一个复杂一点的更完整的 ...
- 手把手教你如何利用 HeroKu 免费获取一个 Scrapyd 集群
手把手教你如何利用 HeroKu 免费获取一个 Scrapyd 集群 本文原始地址:https://sitoi.cn/posts/48724.html 准备环境 一个 GitHub 的账号 一个 He ...
随机推荐
- 从Python语言的角度看C++的指针
技术背景 从一个Python Coder的角度来说,其实很羡慕C++里面指针类型的用法,即时指针这种用法有可能会给程序带来众多的不稳定因素(据C++老Coder所说).本文主要站在一个C++初学者的角 ...
- Jmeter 如何连接mysql数据库?
1 首先安装jmeter jdbc 插件 JDBC驱动包下载教程:https://blog.csdn.net/qq_50896685/article/details/129154801 2 安装好后将 ...
- supervisor的使用与配置说明
Supervisor 是用 Python 开发的一套通用的 进程管理程序 ,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启. 一. 安装 1.1 安装 # 根目录下 ...
- picgo+gitee+typora实现博客图床
背景 在微信公众号编写了推文后,从推文里面复制内容出来在其他平台发布,会出现图片展示不出来的情况,原因是因为该图片是微信的链接,被限制在其他平台显示. 诉求 编写的推文在多个平台都能进行发布,图片在多 ...
- 【深度学习】批量归一化 BatchNormalization
一.背景 机器学习的本质是对物理世界进行建模,做的就是拟合数据分布. 但是在模型训练过程中,神经网络参数不断更新,导数中间层的数据分布频繁地变化(内部协变量偏移),不利于网络参数 ...
- 快速将json装DTO的GsonFormatPlus插件使用
参考:https://www.jianshu.com/p/8fb0e4274436 https://blog.csdn.net/qq_43039260/article/details/12676582 ...
- [置顶]
tomcat处理请求导致页面出现ERR_CONNECTION_RESET错误解决方案
现象: 浏览器发送请求到servlet,servlet处理时间太久,所以导致chrome浏览器出现ERR_CONNECTION_RESET错误 解决方案: 在相应servlet执行最后添加一句代码: ...
- 怎样给U盘加密
给U盘加密其实很简单,下载一个叫U盘超级加密3000的U盘加密软件就可以了. 这款U盘加密的软件最大的特点是不用安装,只要一个exe文件.你把它放到你需要加密的U盘里,就可以加密U盘里的数据了.并且到 ...
- 喜报|3DCAT入选“灵境杯”深圳市最佳元宇宙案例!
2022年11月10日~11日,2022全球元宇宙大会深圳站胜利召开,在本次大会上重磅发布"灵境杯"全球元宇宙创新大赛成果,公布深圳最具潜力元宇宙入选企业. 创新大赛结合" ...
- TP6框架--EasyAdmin学习笔记:数据表添加新参数,如何强制清除缓存
这是我写的学习EasyAdmin的第六章,这一章我给大家分享下如何在数据表中添加新参数,并强制清除缓存 这一章的主题是我在开发中碰到的一个问题,当我在网上疯狂查找解决方法依旧一无所获后,我又尝试了从底 ...