[dev][go] 入门Golang都需要了解什么
一 什么是Golang
首先要了解Golang是什么。
Golang是一门计算机编程语言;可以编译成机器码的像python一样支持各种特性的高级语言。
由Google发明,发明人之一是K,就是C语言的那个K&R的K。
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。而在于丰富的库。
这里,有一个所有库的列表,以及他们的文档:
五 实践
你需要找一份写的好的代码,读一读抄一抄。
然后,再找一个不太复杂的需求,写一写。
六 另外
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("张三",)
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
}
[dev][go] 入门Golang都需要了解什么的更多相关文章
- CQRS简单入门(Golang)
一.简单入门之入门 CQRS/ES和领域驱动设计更搭,故整体分层沿用经典的DDD四层.其实要实现的功能概要很简单,如下图. 基础框架选择了https://github.com/looplab/even ...
- gRPC入门—golang实现
1.RPC 1.1 什么是RPC RPC(Remote Procedure Call),即远程过程调用,过程就是方法,简单来说,它就是一种能够像调用本地方法一样调用远程计算机进程中的方法的技术,在这种 ...
- /dev/fb0入门练习
转:http://hi.baidu.com/fsx92/item/bdbf90d8adab409f260ae738 大家都知道Unix/Linux系统是由命令驱动的.那么最基本的系统是命令行的(就是想 ...
- Golang 入门 : 结构体(struct)
Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型.试图表示一个现实世界中的实体. 结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和 ...
- Golang入门(2):一天学完GO的基本语法
摘要 在配置好环境之后,要研究的就是这个语言的语法了.在这篇文章中,作者希望可以简单的介绍一下Golang的各种语法,并与C和Java作一些简单的对比以加深记忆.因为这篇文章只是入门Golang的第二 ...
- 数据结构和算法(Golang实现)(1)简单入门Golang-前言
数据结构和算法在计算机科学里,有非常重要的地位.此系列文章尝试使用 Golang 编程语言来实现各种数据结构和算法,并且适当进行算法分析. 我们会先简单学习一下Golang,然后进入计算机程序世界的第 ...
- 简单的Hibernate入门简介
其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西, ...
- 史上最简单的Hibernate入门简单介绍
事实上Hibernate本身是个独立的框架,它不须要不论什么web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了非常多非Hibernate ...
- Golang学习途径总结
最近要进入一个新团队,新团队对异步开发好像很重视,我对异步开发技术再次做了一调研,其中Golang,之前看过一次The way to go,感觉就是简化C加协程和通道,这次又重新翻起,首先看了一下&l ...
随机推荐
- bat执行python脚本,执行多条命令
1.新建一个txt文档,输入以下命令 @echo offcmd /k python F:\Pycharm_Projection\Test\test2.py 2.将txt文档保存为.bat格式,然后双击 ...
- 20165230 Exp3 免杀原理与实践
目录 1.实验内容 2.基础问题回答 3.实验内容 任务一:正确使用免杀工具或技巧 使用msf编码器,msfvenom生成如jar之类的其他文件 使用veil-evasion 自己利用shellcod ...
- K-means clustering
K-means算法是一种迭代算法,步骤如下: 1.随机初始化K个聚类中心u1,u2,...,uk 2.根据每个样本和各个聚类中心的距离给每个样本打上标签(例如,x(i)与u3的距离最小,则x(i)的标 ...
- golang 中string和int类型相互转换
总结了golang中字符串和各种int类型之间的相互转换方式: string转成int: int, err := strconv.Atoi(string)string转成int64: int64, e ...
- HTTP协议09-响应首部字段
响应首部字段 响应首部字段是由服务器向客户端返回响应报文中所使用的字段,用于补充响应的附加信息.服务器信息,以及对客户端的附加要求等信息. 1)Accept-Ranges Accept-Range:b ...
- codeforces 893F - Physical Education Lessons 动态开点线段树合并
https://codeforces.com/contest/893/problem/F 题意: 给一个有根树, 多次查询,每次查询对于$x$i点的子树中,距离$x$小于等于$k$的所有点中权值最小的 ...
- Fiddler模拟自动响应数据
Fiddler模拟自动响应数据 定位到要修改的部分 2.将返回的数据保存到本地,保存成网页,并修改响应数据 找到修改的部分,修改之 3.再次请求刷新首页,将工具定位到autoresponder将接口加 ...
- 【原创】大叔经验分享(9)yarn重要配置yarn.nodemanager.local-dirs
yarn中有一个比较重要的配置yarn.nodemanager.local-dirs,如果配置的不好,在饱和状态运行下集群会出现很多问题:1 默认配置${hadoop.tmp.dir}/nm-loca ...
- web开篇
一.内容回顾 1.python基础 2.网络编程 3.并发编程 4.前端 5.数据库(MySQL) 二.今日概要 1.了解Web应用程序的本质 2.Django简介及安装使用 三.今日详细 1.最简单 ...
- MySQL视图,函数,触发器,存储过程
1. 视图 视图是一个虚拟表,它的本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来, ...