目录 start

  1. Go
    1. 社区
      1. 教程
    2. 书籍
    3. 安装
      1. Docker
    4. 环境变量解释
    5. 基本开发环境搭建
    6. 数据类型
      1. 基本类型
        1. int
        2. int64
      2. Array
      3. Slice
      4. Map
      5. Set
    7. 基本语法
      1. 标准输入输出
    8. 函数
      1. 参数
      2. 返回值
    9. 接口
    10. 文件操作
    11. Test
    12. JSON
  2. Tips
    1. 通过字符串调用指定函数

目录 end|2019-10-19 17:04|


Go

官网 | 镜像官网 | Github Repo | Go Doc

Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

参考博客: Golang官网被墙解决办法
参考博客: why is go popular in china
参考博客: 我为什么放弃Go语言
参考博客: 使用Go语言工作400天后的感受
Golang vs Rust vs Dlang 哪个更有前途大致就是go偏向Java Python Rust 偏向 C++ 的领域

go相关应用
docker golang lantern kubernetes awesome-go gogs synching hugo grafana etcd hub influxdb caddy beego martini cayley nsq codis delve cobra shadowsocks-go phcolus


社区

教程


书籍

Go语言高级编程(Advanced Go Programming)
Go 语言学习资料与社区索引


安装

Official Download | Official Doc | 参考 教程 .

  1. sudo tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz 安装和升级都是如此
    • 注意: 升级前必须 rm -rf /usr/local/go 以免造成文件的混乱
  2. *shrc 或者 /etc/profile 中添加

    1
    2
    3
    4
    export GOROOT=/usr/local/go
    export GOPATH=$HOME/Code/go # workspace
    export GOBIN=$GOPATH/bin # 'go install' command install dir
    export PATH=$PATH:$GOBIN:$GOPATH:$GOROOT/bin
  3. 查看版本 go version正常输出go的版本则是配置成功


  1. /home/kcp/code/go 下 新建 test.go

    1
    2
    3
    4
    5
    package main
    import "fmt"
    func main() {
    fmt.Printf("hello, world\n")
    }
  2. go run test.go 或者 go build

Docker

使用Docker安装和部署

Docker image 这里的镜像都是用于 从源码编译构建成可执行文件的 环境
go 的 Docker镜像的讨论

  1. 实际运行的时候, 如果不需要调用外部Linux命令 就直接使用空镜像 from scratch
  2. 需要外部命令则 from alpine 更精简一点 更好是使用 frolvlad/alpine-glibc

环境变量解释

关于GOROOT、GOPATH、GOBIN、project目录
GOPATH 深度解析

  • Go 开发环境依赖于一些操作系统环境变量,你最好在安装 Go 之间就已经设置好他们。如果你使用的是 Windows 的话,你完全不用进行手动设置,Go 将被默认安装在目录 c:/go 下。这里列举几个最为重要的环境变量:
    • $GOROOT 表示 Go 在你的电脑上的安装位置,它的值一般都是 $HOME/go,当然,你也可以安装在别的地方。
    • $GOARCH 表示目标机器的处理器架构,它的值可以是 386、amd64 或 arm。
    • $GOOS 表示目标机器的操作系统,它的值可以是 darwin、freebsd、linux 或 windows。
    • $GOBIN 表示编译器和链接器的安装位置,默认是 $GOROOT/bin,如果你使用的是 Go 1.0.3 及以后的版本,一般情况下你可以将它的值设置为空,Go 将会使用前面提到的默认值。
      • 为了区分本地机器和目标机器,你可以使用 $GOHOSTOS$GOHOSTARCH 设置目标机器的参数,这两个变量只有在进行交叉编译的时候才会用到,
      • 如果你不进行显示设置,他们的值会和本地机器($GOOS$GOARCH)一样。
    • $GOPATH 默认采用和 $GOROOT 一样的值,但从 Go 1.1 版本开始,你必须修改为其它路径。它可以包含多个包含 Go 语言源码文件、包文件和可执行文件的路径,
      • 而这些路径下又必须分别包含三个规定的目录:src、pkg 和 bin,这三个目录分别用于存放源码文件、包文件和可执行文件。
    • $GOARM 专门针对基于 arm 架构的处理器,它的值可以是 5 或 6,默认为 6。
    • $GOMAXPROCS 用于设置应用程序可使用的处理器个数与核数,详见第 14.1.3 节。

基本开发环境搭建

Github:Golang

入门时使用 VSCode 是比较方便的, VSCode 会推荐我们安装如下工具

  1. tools 工具集
    1. guru golang.org/x/tools/cmd/guru
    2. gorename golang.org/x/tools/cmd/gorename
  2. lint golang.org/x/lint
    1. golint golang.org/x/lint/golint
  3. go-outline github.com/ramya-rao-a/go-outline
  4. go-symbols github.com/acroca/go-symbols
  5. goreturns github.com/sqs/goreturns
  6. dep github.com/golang/dep

由于 golang.org 用的是Google的服务器, 所以…, 这几个工具不能直接安装 guru gorename imports(goreturns要用到) lint golint
但是本质上都是获取源码而已, 所以可以从github获取

汇总一下命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cd $GOPATH
mkdir -p src/golang.org/x/tools
git clone --depth 1 https://github.com/golang/tools src/golang.org/x/tools

mkdir -p src/golang.org/x/lint
git clone --depth 1 https://github.com/golang/lint src/golang.org/x/lint

mkdir -p src/github.com/golang/dep
git clone --depth 1 https://github.com/golang/dep src/github.com/golang/dep

go get golang.org/x/tools/cmd/guru
go get golang.org/x/tools/cmd/gorename
go get golang.org/x/lint
go get golang.org/x/lint/golint
go get github.com/ramya-rao-a/go-outline
go get github.com/acroca/go-symbols
go get github.com/sqs/goreturns
go get github.com/golang/dep

可以利用码云来加速下载

  1. lint https://gitee.com/gin9/golang-lint.git
  2. tools https://gitee.com/gin9/golang-tools.git

数据类型

有关类型后置

螺旋形(C/C++)和顺序(Go)的声明语法
Why do a lot of programming languages put the type after the variable name?

基本类型

int

int64

1
2
3
4
5
6
7
8
// string到int
int,err:=strconv.Atoi(string)
// string到int64
int64, err := strconv.ParseInt(string, 10, 64)
// int到string
string:=strconv.Itoa(int)
// int64到string
string:=strconv.FormatInt(int64,10)

Array

Slice

Map

Set


基本语法

标准输入输出

参考博客: golang中的格式化输入输出


函数

基本结构

1
2
3
4
// 函数名 (参数 ) 返回值{函数体}
func functionName (param1 int) int {

}

函数作为参数 functionName func(string, string)

参数

返回值


接口

参考:接口的定义和使用


文件操作

递归读取当前目录的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
filepath.Walk("./", walkfunc)
}
func walkfunc(path string, info os.FileInfo, err error) error {
if(!info.IsDir()){
fmt.Println(path)
}
return nil
}


Test

Github: assert


JSON

结构体必须是大写字母开头的成员才会被处理(大写字母开头才有对外权限)

参考博客: Go操作JSON
参考博客: go and json
参考博客: 在Go语言中使用JSON

website: json to go struct

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
	type GridConfig struct {
ID int `json:"id"`
Row int `json:"row"`
Col int `json:"col"`
Data []int `json:"data"`
}

// 第一种
func (*GenerateGrid) ReadConfig() []GridConfig {
var datas []GridConfig
fp, _ := os.Open("grid.json")
dec := json.NewDecoder(fp)
for {
err := dec.Decode(&datas)
if err != nil {
fmt.Println(err)
break
}
//use v
// fmt.Printf("%+v", datas)
for _, line := range datas {
fmt.Println(" ", line)
}
}

// 第二种方式
var datas []GridConfig
raw, err := ioutil.ReadFile("./grid.json")
// fmt.Println(raw)
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
err = json.Unmarshal(raw, &datas)
if err != nil {
fmt.Println("error:", err)

}
for _, line := range datas {
fmt.Println(" ", line)
}

return datas
}

Tips

通过字符串调用指定函数

参考博客: Go 根据字符串调用指定函数
参考博客: WebAssembly 和 Go语言:对未来的观望