[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 ...
随机推荐
- 【原创】Linux基础之常用命令
1 磁盘.cpu.内存相关 查看全部设备信息 # lspci 查看整体磁盘空间占用情况 # df -h 查看整体磁盘inode占用情况 # df -i 查看文件详细信息 # ls -l $path 查 ...
- bootstrap轮播图 两侧半透明阴影
用bootstrap轮播图:Carousel插件,图片两侧影音实在碍眼,想去掉,首先发现有css里由opacity: 0.5这个东西来控制,全部改成opacity: 0.0,发现指示箭头也看不见了. ...
- 树·AVL树/平衡二叉树
1.AVL树 带有平衡条件的二叉查找树,所以它必须满足条件: 1 是一棵二叉查找树 2 满足平衡条件 1.1 平衡条件: 1)严格的平衡条件:每个节点都必须有相同高度的左子树和右子树(过于严格而不被使 ...
- 【python3接口自动化基础】json总结
Json知识归纳: Post请求有两种方法传json参数 传json参数(自动转json了)---json=dict 传data参数(需json转换) ---data=json.dumps(dic) ...
- 数位dp-入门模板题 hdu2089
#include<bits/stdc++.h> using namespace std; ][],n,m; void init(){//dp[i][j]:i位的数,最高位是j dp[][] ...
- [慢更]Sublime Text 快捷键及使用过的插件
整理自己常用的sublime text命令和插件 1.pretty json Json 快速格式化,免去url访问json站点的烦恼. 摘自:https://segmentfault.com/a/11 ...
- JavaScript 动态选择方法和属性
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 在vue里添加好看的lottie动画 (^_^)
为什么用lottie ★~★ 1.能让你的程序不那么单调 2.能让一些有审美强迫症的同学好受一点 3.网上有丰富的资源 点我进入lottie资源网站 引入lottie库 (>.<) 在vu ...
- Beta(4/7)
鐵鍋燉腯鱻 项目:小鱼记账 团队成员 项目燃尽图 冲刺情况描述 站立式会议照片 各成员情况 团队成员 学号 姓名 git地址 博客地址 031602240 许郁杨 (组长) https://githu ...
- Elasticsearch学习笔记三
PS:前面两章已经介绍了ES的基础及REST API,本文主要介绍ES常用的插件安装及使用. Elasticsearch-Head Head是一个用于管理Elasticsearch的web前端插件,该 ...