您现在的位置是:首页 >技术教程 >GO语言学习之一——基础网站首页技术教程

GO语言学习之一——基础

曹自标 2023-07-06 20:00:02
简介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

演化分析:

  1. 在 GOPATH 构建模式下,Go 编译器实质上并没有关注 Go 项目所依赖的第三方包的版本
  2. vendor 机制虽然一定程度解决了 Go 程序可重现构建的问题。但Go项目必须放在 GOPATH 环境变量配置的路径下,庞大的 vendor 目录需要提交到代码仓库,不仅占用代码仓库空间,减慢仓库下载和更新的速度,而且还会干扰代码评审,对实施代码统计等开发者效能工具也有比较大影响。

go module 使用步骤:

  1. go mod init xxx
  2. 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六类常规操作

  1. 安装一个go的依赖包
  2. go的依赖包降级
  3. go的依赖包升级
  4. go的依赖包主版本升级
  5. go 自动 go.mod 下不需要的依赖包路径
  6. 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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。