装置
操作系统是Ubuntu22 64 x86
拜访 golang
官网文档,获取最新安装包
https://go.dev/doc/install
下载与解压,目前最新的版本是1.19
$ wget https://dl.google.com/go/go1.19.2.linux-amd64.tar.gz
# 删除旧版本 go
$ rm -rf /usr/local/go
$ tar -C /usr/local -xzf go1.19.2.linux-amd64.tar.gz
配置环境变量
GOPATH
- 示意
golang
的工作空间,蕴含三个子目录 -
src
外面的子目录都是包,蕴含我的项目源码src
上面举荐蕴含两级目录,github.com
(仓库域名)以及用户名称目录,构造变成src/github.com/user/project-a
- 比方
go get -u github.com/gin-gonic/gin
这样的,在用户获取一个包的时候蕴含域名,组织或者用户,具体的我的项目
pkg
编译后生成的,包的指标文件bin
生成的可执行文件
创立工作空间如下
$ mkdir $HOME/golang
$ cd $HOME/golang
$ mkdir src pkg bin
$ cd src
$ mkdir -p github.com/gong/hello-world
GOROOT
golang
的装置目录
配置环境变量,创立文件/etc/profile.d/golang.sh
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=$HOME/golang
以后 shell
失效验证
$ source /etc/profile
$ go version
配置 go
获取依赖的代理
$ go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/
Hello world
用编译器关上$HOME/golang/github.com/gong/hello-world
新建一个文件main.go
package main
import "fmt"
func main() {fmt.Println("Hello World!")
}
编译之前须要执行一条命令,创立包的依赖文件,该文件记录了包的依赖信息
$ go mod init
更新依赖
$ go mod tidy
编译,在与 main.go
文件同级目录下执行如下
$ go build
$ ll
总用量 1.8M
-rw-rw-r-- 1 gong gong 44 10 月 26 17:04 go.mod
-rwxrwxr-x 1 gong gong 1.8M 10 月 26 17:04 hello-world
-rw-rw-r-- 1 gong gong 73 10 月 26 16:59 main.go
能够看到生成了一个 hello-world
文件,执行如下能够打印
$ ./hello-world
Hello World!
或者能够间接编译运行一步到位
$ go run .
Hello World!
go web
采纳 gin
框架进行开发
获取包
$ go get -u github.com/gin-gonic/gin
批改文件 main.go
的内容
package main
import (
"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 mod tidy
去查看 go.mod
文件的时候发现文件内容曾经发生变化
启动 web
我的项目
$ go run .
这时候能够应用浏览器拜访地址 http://127.0.0.1:8080/ping
测试返回数据
打包编译为docker
在与 main.go
创立文件Dockerfile
因为是编译型语言,适宜采纳分阶段构建,达到最小镜像
FROM golang:1.19-alpine as builder
ENV GOPROXY="https://mirrors.aliyun.com/goproxy/"
WORKDIR /work
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk update && apk add tzdata
ADD go.mod .
ADD go.sum .
RUN go mod download
COPY . .
RUN go build -o web
FROM alpine:3.16
WORKDIR /work
COPY --from=builder /work/web .
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN chmod +x web
ENTRYPOINT ["./web"]
创立镜像如下,镜像名称为web
$ docker build -t web .
查看镜像大小
$ docker images |grep web
web latest 259944109b18 About an hour ago 26.5MB
创立 compose.yaml
文件写入如下
须要传入 gin
的环境变量使得 gin
以公布模式运行,进步性能
services:
web:
image: web
container_name: web
ports:
- "8080:8080"
restart: always
environment:
- GIN_MODE=release
当初我的项目上面文件如下,其中 go.mod
和go.sum
是运行 go mod
命令主动治理生成的库依赖相干文件
$ ll
总用量 36K
-rw-rw-r-- 1 gong gong 148 10 月 26 17:50 compose.yaml
-rw-rw-r-- 1 gong gong 468 10 月 26 17:42 Dockerfile
-rw-rw-r-- 1 gong gong 2.9K 10 月 26 17:38 go.mod
-rw-rw-r-- 1 gong gong 19K 10 月 26 17:38 go.sum
-rw-rw-r-- 1 gong gong 280 10 月 26 17:27 main.go
启动服务,拜访 http://127.0.0.1:8080
测试一下
$ docker compose up -d
参考浏览
golang
官网文档
gin
官网文档