zoukankan      html  css  js  c++  java
  • [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
    }
  • 相关阅读:
    Algorithm Gossip (48) 上三角、下三角、对称矩阵
    .Algorithm Gossip (47) 多维矩阵转一维矩阵
    Algorithm Gossip (46) 稀疏矩阵存储
    Algorithm Gossip (45) 费氏搜寻法
    Algorithm Gossip (44) 插补搜寻法
    Algorithm Gossip (43) 二分搜寻法
    Algorithm Gossip (42) 循序搜寻法(使用卫兵)
    Algorithm Gossip (41) 基数排序法
    Algorithm Gossip (40) 合并排序法
    AlgorithmGossip (39) 快速排序法 ( 三 )
  • 原文地址:https://www.cnblogs.com/hugetong/p/10659470.html
Copyright © 2011-2022 走看看