[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 ...
随机推荐
- monkeyrunner环境配置
1.安装JDK.android SDK.Python (安装完成后,配置环境变量:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%ANDROID_HOME%\platfor ...
- EF的三种数据加载方式
EF的关联实体加载有三种方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy Loading和Explicit Loading都是延迟加载. (一 ...
- 转:对UI自动化测试的一些感悟
不断发掘自动化测试对各个团队的附加价值,这样才能得到来自四面八方的支持,没有将自动化加入项目过程的自动化都达不到预期的效果. UI自动化框架 把UI自动化框架设计成一个拼图性质的架构.把每个特性都设计 ...
- django中sqlite迁移mysql
sqlite数据迁移 1 数据备份 django中打开terminalpython manage.py dumpdata authorization > authorization_data.j ...
- ESP8266代码中的存储标记
const uint8 MyArr[1024] ICACHE_RODATA_ATTR = {0}; void MyFun() ICACHE_FLASH_ATTR { } 这种 ICACHE 开头的宏作 ...
- 点击页面上的元素,页面删除removeChild()
简单描述:最近做了一个图片上传,上传完成回显图片的时候,需要用到点击图片,从页面删除的效果,然后就找到了removeChild()方法,说实话,我刚看到的时候,就觉得这个问题已经解决了,但是却发现这个 ...
- All about Using Burp Suite
1.how to use burpsuite I can't thank them enough for allowing us to test web application ,making su ...
- mysql拼接字符串
CONCAT(str1,str2,...) 如:在每一列meeting_persons的现有内容之上,增加15112319字符串 UPDATE wos_hrs.meeting_logs SET mee ...
- 论文阅读笔记四十六:Feature Selective Anchor-Free Module for Single-Shot Object Detection(CVPR2019)
论文原址:https://arxiv.org/abs/1903.00621 摘要 本文提出了基于无anchor机制的特征选择模块,是一个简单高效的单阶段组件,其可以结合特征金字塔嵌入到单阶段检测器中. ...
- linux下安装redis并开机自启动
分享一个博客地址, 写的太好了, 满满的都是干货 ! https://www.cnblogs.com/renzhicai/p/7773080.html