Skip to content

安装

操作系统是Ubuntu22 64 x86

访问golang官方文档,获取最新安装包

https://go.dev/doc/install
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
$ 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
$ 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

shell
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=$HOME/golang
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=$HOME/golang

当前shell生效验证

$ source /etc/profile
$ go version
$ source /etc/profile
$ go version

配置go获取依赖的代理

$ go env -w GOPROXY=https://goproxy.cn,direct
$ go env -w GOPROXY=https://goproxy.cn,direct

Hello world

用编译器打开$HOME/golang/github.com/gong/hello-world

新建一个文件main.go

go
package main

import "fmt"

func main() {
	fmt.Println("Hello World!")
}
package main

import "fmt"

func main() {
	fmt.Println("Hello World!")
}

编译之前需要执行一条命令,创建包的依赖文件,该文件记录了包的依赖信息

$ go mod init
$ go mod init

更新依赖

$ go mod tidy
$ 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
$ 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!
$ ./hello-world 
Hello World!

或者可以直接编译运行一步到位

$ go run .
Hello World!
$ go run .
Hello World!

go web

采用gin框架进行开发

获取包

$ go get -u github.com/gin-gonic/gin
$ go get -u github.com/gin-gonic/gin

修改文件main.go的内容

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")
}
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 tidy

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

启动web项目

$ go run .
$ go run .

这时候可以使用浏览器访问地址http://127.0.0.1:8080/ping测试返回数据

打包编译为docker

在与main.go创建文件Dockerfile

由于是编译型语言,适合采用分阶段构建,达到最小镜像

dockerfile
FROM golang:1.19-alpine as builder

WORKDIR /work
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
  && go env -w GOPROXY=https://goproxy.cn,direct \
  && 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"]
FROM golang:1.19-alpine as builder

WORKDIR /work
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
  && go env -w GOPROXY=https://goproxy.cn,direct \
  && 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 build -t web .

查看镜像大小

$ docker images |grep web
web                   latest        259944109b18   About an hour ago   26.5MB
$ docker images |grep web
web                   latest        259944109b18   About an hour ago   26.5MB

创建compose.yaml文件写入如下

需要传入gin的环境变量使得gin以发布形式运行,提高性能

yaml
services:
  web:
    image: web
    container_name: web
    ports:
      - "8080:8080"
    restart: always
    environment:
      - GIN_MODE=release
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
$ 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
$ docker compose up -d

参考阅读

golang官方文档

gin官方文档

Last updated:

Released under the MIT License.