您现在的位置是:首页 >技术教程 >GO语言学习之一——基础网站首页技术教程
GO语言学习之一——基础
简介GO语言学习之一——基础
GO语言基础
配置GO环境
查看环境变量
go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/hui/Library/Caches/go-build"
GOENV="/Users/hui/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/hui/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/hui/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/8f/vnx2y1h57nzbd2p4vtcl6hv80000gn/T/go-build487191191=/tmp/go-build -gno-record-gcc-switches -fno-common"
# GOROOT
golang 的安装路径,MAC环境下安装后,默认在(/usr/local/go)
# GOPATH
可以理解为工作目录,该目录下约定有三个子目录,分别为:src、pkg、bin;
src: 存放源代码(比如:.go .c .h .s等) 按照golang默认约定,go run,go install等命令的当前工作路径(即在此路径下执行上述命令)。
pkg: 存放编译时生成的中间文件(比如:.a)
bin: 存放编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中,如果有多个GOPATH,那么使用${GOPATH//://bin:}/bin添加所有的bin目录)
# GOBIN
当我们使用go install命令编译和打包应用程序时,该命令会将编译后二进制程序文件 存放到GOBIN目录下,一般我们将GOBIN设置为$GOPATH/bin目录。
https://www.jianshu.com/p/17365bce7e8f
GO程序结构
https://www.jianshu.com/p/79aa98bd37ec
https://go.dev/talks/2014/names.slide#19
GO项目标准布局
https://zhuanlan.zhihu.com/p/452727839?utm_id=0
https://go.dev/doc/effective_go#names
怎么解决包依赖管理问题
Go 语言的构建模式历经了三个迭代和演化过程:
- 最初期的 GOPATH
- 1.5 版本的 Vendor 机制
- 以及现在的 Go Module
演化分析:
- 在 GOPATH 构建模式下,Go 编译器实质上并没有关注 Go 项目所依赖的第三方包的版本
- vendor 机制虽然一定程度解决了 Go 程序可重现构建的问题。但Go项目必须放在 GOPATH 环境变量配置的路径下,庞大的 vendor 目录需要提交到代码仓库,不仅占用代码仓库空间,减慢仓库下载和更新的速度,而且还会干扰代码评审,对实施代码统计等开发者效能工具也有比较大影响。
go module 使用步骤:
- go mod init xxx
- go mod tidy
package main
import "github.com/sirupsen/logrus"
func main() {
logrus.Println("hello, go module mode")
}
go.mod
module github.com/caozibiao/go_study/go_base
go 1.20
require github.com/sirupsen/logrus v1.9.0
require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
https://www.cnblogs.com/niuben/p/16182001.html
GO MODULE六类常规操作
- 安装一个go的依赖包
- go的依赖包降级
- go的依赖包升级
- go的依赖包主版本升级
- go 自动 go.mod 下不需要的依赖包路径
- go vendor
https://blog.csdn.net/qq_41407687/article/details/128052791
入口函数与包初始化:搞清程序执行顺序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W8v1tYfL-1682928724085)(assets/16829256126769.jpg)]
go语言标准规定了多个编译单元的初始化顺序,包的初始化顺序按照包引入的顺序进行初始化,如果有依赖关系先解决依赖关系,按依赖的顺序进行初始化。
- 如果某个包被多次导入的话,也只会初始化一次。
- 对于同一个包中的多个.go文件,实现一般按照文件名排序,进行初始化
- 首先按顺序初始化全局常量和变量,如果有依赖关系先解决依赖关系,按依赖的顺序进行初始化
- 再调用init函数进行初始化, 其在可执行程序的main入口函数执行之前自动执行,而且不可被直接调用
- 并且go语言是不允许包循环引用的,也不允许全局常量变量循环引用。
https://www.cnblogs.com/HachikoT/p/15682988.html
https://blog.csdn.net/bx13099003035/article/details/129684952
构建WEB服务
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// 创建一个默认的路由引擎
r := gin.Default()
// GET:请求方式;/hello:请求的路径
// 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数
r.GET("/hello", func(c *gin.Context) {
// c.JSON:返回JSON格式的数据
c.JSON(200, gin.H{
"message": "Hello world!",
})
})
// 启动HTTP服务
r.Run()
}
https://zhuanlan.zhihu.com/p/350002797
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。