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
    }
  • 相关阅读:
    [转载]ASP.NET实现数字和字符相混合的验证码
    [分享]软件开发全套规范
    [转载]混沌理论简介
    [原创]利用WM_COPYDATA实现进程间通信
    [转载]I like the subtle...
    [原创]DES算法的介绍以及实现(含上次DES程序1.0的源码)
    [转载]高校自动排课系统的实践
    [公告]对DES算法源码的bug道歉
    [转载]基于混沌理论的资本投资研究
    使用 异步多线程TCP Socket 实现进程间通信(VC 6.0 , BCB6.0调试通过)
  • 原文地址:https://www.cnblogs.com/hugetong/p/10659470.html
Copyright © 2011-2022 走看看