装置

操作系统是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/goexport PATH=$GOROOT/bin:$PATHexport 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 mainimport "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 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 mod tidy

去查看go.mod文件的时候发现文件内容曾经发生变化

启动web我的项目

$ go run .

这时候能够应用浏览器拜访地址http://127.0.0.1:8080/ping测试返回数据

打包编译为docker

在与main.go创立文件Dockerfile

因为是编译型语言,适宜采纳分阶段构建,达到最小镜像

FROM golang:1.19-alpine as builderENV GOPROXY="https://mirrors.aliyun.com/goproxy/"WORKDIR /workRUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositoriesRUN apk update && apk add tzdataADD go.mod .ADD go.sum .RUN go mod downloadCOPY . .RUN go build -o webFROM alpine:3.16WORKDIR /workCOPY --from=builder /work/web .COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN chmod +x webENTRYPOINT ["./web"]

创立镜像如下,镜像名称为web

$ docker build -t web .

查看镜像大小

$ docker images |grep webweb                   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.modgo.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官网文档