Saber2pr's Blog

golang快速上手

环境搭建

这里推荐使用 docker 快速搭建开发环境:

golang

安装 go 编译器

前往官网下载安装 https://go.dev/dl/

注意 mac 是 arm 还是 amd

配置环境变量

go 有两个环境变量, GOPATH 是三方工具安装路径,GOROOT 是编译器路径,以 docker 环境变量为例:

ENV GOPATH /usr/local/gopath
ENV GOROOT /usr/local/go
ENV PATH $GOROOT/bin:$PATH
RUN chmod -R 777 "$GOROOT"

模块

go 一般以一个文件夹为一个模块,顶部 package 声明模块名,例如如下目录:

./pkg
|-- hello
|   `-- main.go
|-- utils
|   `-- string.go
`-- vars
    `-- main.go

pkg 目录下有三个模块,hello、utils、vars

以 hello 模块为例:

// pkg/hellp/main.go
package hello

import (
    "golangstart/pkg/utils"
    "github.com/hashicorp/go-uuid"
)

func Log() string {
    str := utils.TestStr()
    uuid, _ := uuid.GenerateUUID()
    return str + uuid
}

注意到github.com/hashicorp/go-uuid是一个三方库,通过命令 go get <pkg-name> 安装:

go get github.com/hashicorp/go-uuid

go 模块中 import 为导入,而没有导出语法。go 约定中首字母大写的变量/函数等会被导出。

注意到golangstart/pkg/utils是导入当前项目的其他模块, golangstart 是当前项目的包名,定义在./go.mod 中:

module golangstart

go 1.17

require github.com/hashicorp/go-uuid v1.0.2 // indirect

go.mod 中描述了当前项目的包名,依赖 go 编译器的版本,依赖的三方库

程序入口

目录结构

go 文件中也约定了 main 函数作为程序执行入口,当前项目的目录结构如下:

./
|-- Dockerfile
|-- README.MD
|-- build.sh
|-- cli
|   |-- hello
|   |-- main
|   `-- vars
|-- cmd
|   |-- hello
|   |   `-- main.go
|   `-- vars
|       `-- main.go
|-- go.mod
|-- go.sum
|-- main.go
`-- pkg
    |-- hello
    |   `-- main.go
    |-- utils
    |   `-- string.go
    `-- vars
        `-- main.go

主要关注 pkg、cmd、cli 三个目录,pkg 为模块目录,cmd 为程序执行入口目录,cli 为编译产物目录.

执行 main 函数入口

例如 cmd/hello 文件:

// cmd/hello/main.go
package main

import (
    "fmt"
    "golangstart/pkg/hello"
)

func main() {
    str := hello.Log()
    fmt.Println(str)
}

当执行 cmd/hello/main.go 时,自动执行 main 函数

编译输出

在调试阶段时,go 文件可直接执行:

go run ./cmd/hello

go 编译命令为:

go build -o ./cli/hello ./cmd/hello

会将 cmd/hello 编译为二进制可执行文件到 cli/hello.

go 的优势之一就是,编译后的二进制文件不需要依赖任何环境,可以直接执行

以上示例项目地址:

golangstart