[dev][go] 入门Golang都需要了解什么

一 什么是Golang

首先要了解Golang是什么。

Golang是一门计算机编程语言;可以编译成机器码的像python一样支持各种特性的高级语言。

由Google发明,发明人之一是K,就是C语言的那个K&R的K。

网站:https://golang.org/

golang到底要解决什么问题?

1. 解决C,C++在大工程中的复杂性,复杂性越高风险就越大。比如,增加了gc。

2. 解决快速,大规模,高并发的应用场景。引入协程。据说创建一个协程的开销,微乎其微。

二 安装环境

安装环境,无外乎就是安装编译器。

有两套(我知道的),一个官方的Go,一个Gcc-Go

这里不讨论GccGo。

2.1 安装

安装官方Go,有两个办法,一个是去网站下载,然后自己解压。另一个是用包管理工具yum,pacman等。

一,自解压

下载的话,就去这里download:https://golang.org/dl/, 然后tar解压就可以了。

之后把你解压的目录的bin,加到PATH环境变量里。然后,和使用包管理工具安装的便没有任何区别。

运行一下go,如果你能看见帮助信息,说明安装正确。

二,pacman

/home/tong [tong@TStation] [10:30]
> sudo pacman -S go

2.2 配置

配置之前,你需要理解什么是包管理,就是java(为什么是java?)里边那个包管理,不是上小结的包管理。

随便找了一个,最好读一下:http://www.runoob.com/java/java-package.html

因为接下来要建立目录结构,而目录结构需要与包结构保持一至,所以最好要懂得包的概念。不过对于不求甚解的你,依葫芦画瓢也是可以的,不懂也罢。

配置的话,

只需要配置你的workspace的路径给GOPATH环境变量就可以了,不配的话,默认在这里:~/go/

这个目录是干啥的?就是GO世界里的根目录,GO的世界都在这个根下,它不认识外边的世界。

在这个目录下,至少需要两个子目录,bin, src。src里是未来的所以代码,src也是所有go package的根。

编译,并install之后的二进制,都在bin下面。当你执行了go install 之后。

举例一个目录实例,注意观察src下的目录树,等同于package的数。

bin/
    hello                          # command executable
    outyet                         # command executable
src/
    github.com/golang/example/
        .git/                      # Git repository metadata
    hello/
        hello.go               # command source
    outyet/
        main.go                # command source
        main_test.go           # test source
    stringutil/
        reverse.go             # package source
        reverse_test.go        # test source
    golang.org/x/image/
        .git/                      # Git repository metadata
    bmp/
        reader.go              # package source
        writer.go              # package source
    ... (many more repositories and packages omitted) ...

也就是说,其实你啥也不用做,只需要创建目录~/go(如果没有),甚至也不需要配环境变量。 所有的初始环境变量:

/home/tong [tong@TStation] [10:37]
> go env        
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/tong/.cache/go-build"
GOENV="/home/tong/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/tong/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/lib/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build134648232=/tmp/go-build -gno-record-gcc-switches"

三 使用

代码写好,并正确的放置到了目录树里边之后,就可以编译,运行了。

go run/build/install 包名。三个命令分别对应着解释执行,编译,安装三个操作。

go的程序,即可以解释执行,可以编译成二进制执行。

不是这样的,GO是编译型语言,在用run命令时,也是编译了再执行的。

如,根据上面的目录结构:

go run github.com/golang/example/
go build hello
go install hello

执行过上边的命令后,在bin目录下会生成可执行程序hello。我们可以直接执行它。

生成执行程序的名字,与包名一致。

你一定要再读一下,这个,会把我上边写的东西,更生动准确的讲一下:

https://golang.org/doc/code.html

四 编码

当完成了以上三步的操作之后,我们便已经具备了go语言的运行环境了。接下来便可以开始学习编码了。

4.1 新手入门

第一个我建议阅读的不是任何书,也不是任何手册,而是这样一份剪短而清晰的指南。理论上如果你足够聪明绝顶(我还不行,我植被茂盛)的话,只看这一个也足够上手了。

https://tour.go-zh.org/welcome/1

4.2  语法规约

你一定是一个严谨的吧?不是可以跳过这里。

作为一个严谨的人,我们一定要了解每一个Go语言的每一个细节。然后再反观设计哲学,才敢写下第一行宝贵的go代码。

语法规约:https://golang.org/ref/spec

4.3 风俗习惯

入乡即要随俗,写代码这种事,有各种各样的穷讲究。命名怎么写,缩进怎么缩。入了中餐馆用筷子,入了西餐馆用刀叉,吃烤全羊用手抓。

进了Go餐馆,我们怎么吃:https://golang.org/doc/effective_go.html

4.4 库

201x年,高级语言(相对于C)最大的魅力不在于灵活的语法,不在于好看的IDE。而在于丰富的库。

这里,有一个所有库的列表,以及他们的文档:

https://golang.org/pkg/

五 实践

你需要找一份写的好的代码,读一读抄一抄。

然后,再找一个不太复杂的需求,写一写。

六 另外

6.1 

另外,还有一本书,我还没看,大家都在看。我马上要去看一下(此刻的我跳过了第五小节)。。。。

https://book.douban.com/subject/27044219/

 

--- 三天后 ---

我不管别人怎么吐槽,我个人读完之后,觉得此书还是比较好的,4星,即使读完了上文的全部文档,仍然值得读,并且,我建议读完上边的文档,再来读这书。

花了三天时间跳跃着看了大概3/4,中文版(偶尔对照英文)。6成细读。

其中,尤其建议精读的是第七章“接口”,其中讲解了接口在实现细节上的原理。我个人觉得这是编译器(java,c++)在实现面向对象时候的基本思路。

读过之后很受启发。另外,第十二章“反射”也有类似的启发。都能在其中理解到当代高级语言的两大重要特性:多态和反射

以我浅薄的见识,读过这两章之后,对编译器的原理也有了根据进一步的感知。

6.2

IDE是什么?没听说过,我只有emacs,详见:

[daily][emacs][go] 配置emacs go-mode的编辑环境以及环境变量问题

vscode 也挺好的其实。。。我用了一下,几乎开箱即用,只需要装一个插件,并保证环境变量设置正确。

Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter:

ext install ms-vscode.Go

https://marketplace.visualstudio.com/items?itemName=ms-vscode.Go

需要注意的是,Go的跳转,符号查找都是基于语义的,而不是基于字符串index。所以如果你的工程无法编译(主要是import),有很大的问题。

这个时候符号的跳转很可能是不好使的,请不要感到意外。

6.3

DEBUG? 还不会。。。文档在这里:https://golang.org/doc/gdb

6.4

内存怎么管理的?协程怎么实现的?

... 不知道

6.5

更多文档在这里

https://github.com/golang/go/wiki/Learn 

https://github.com/golang/go/wiki

七 完

离开了第五小节,其他的都是纸上谈兵。

八 后来

20200213

后来,学的块忘得也快。之后又要用的时候,我又写了这个:[golang] 当用到一知半解的Go丢掉了大半年之后如何又能快速捡起

九 杂七杂八的点点滴滴

20200216  小技巧

定义类(它不叫类)的方法时,类名什么情况下用指针,什么情况下不用?

https://golang.org/doc/faq#methods_on_values_or_pointers

20200218  用reflect设置结构体的值的方法

type Person struct {
    Name   string  `json:"name"`
    Age       int    `json:"age"`
}

func SetValueToStruct(name string,age int) *Person {
        p := &Person{}
        v := reflect.ValueOf(p).Elem()
        v.FieldByName("Name").Set(reflect.ValueOf(name))
        v.FieldByName("Age").Set(reflect.ValueOf(age))
        return p
}


func main()  {
    p := SetValueToStruct("张三",18)
    fmt.Println(*p)
}

https://blog.csdn.net/skh2015java/article/details/79292743

reflec设置结构体失败,报错

panic: reflect: reflect.flag.mustBeAssignable using value obtained using unexported field

我这里的原因是因为:结构体里边的成员首字母,没有的大写。

type HealthCheck struct {
    Test string 
    Bbb int
}
原文地址:https://www.cnblogs.com/hugetong/p/10659470.html