前言
本专栏是笔者在学习《Go程序设计语言》这本书时,对每个章节认为较为重要(容易忘记👻)的知识点记录的笔记,其中也会有少量的思考👀, 现整理成博客分享出来。
❗️注意❗️:本专栏不是详细的知识讲解,只是碎片的知识条目,或可作为Go知识点查漏补缺的小工具~
hello world
go run xxx.go
:将一个或多个go
后缀的源文件进行编译、链接,然后运行生成的可执行文件;Go
原生地支持unicode
,它可以处理所有国家的语言;go build xxx.go
:生成二进制程序;Go
代码是使用包来组织的,类似于其他语言的库和模块;一个包由一个或多个.go
文件组成,放在一个文件夹中;- 每个源文件的开始都用
package
声明,指明这个文件属于哪个包;后面跟着它导入的其它包列表,通过import
指定,且必须跟在package
之后; main
包用来定义一个独立的可执行程序,而不是库;其中的main
函数是程序执行的入口;- 大部分情况,函数、变量、常量、类型的声明顺序是没有关系的;
Go
语句不需要分号结尾,除非多个语句在同一行;gofmt
工具可将代码以标准格式重写;goimports
工具可以按需管理import
的其它包;
命令行参数
-
os.Args
变量获取命令行参数,它是一个字符串的切片(slice
),可以通过len()
函数获取长度; -
对于
slice
可以使用s[m:n]
语法再取切片,其中0<=m<=n<=len(s)
,左闭右开取值; -
Go
只有后自增,且不是一个表达式,意味着这些都是不允许的:j = i++; --i
; -
for
是Go
里面唯一的循环语句,形式很多,其中之一是:// 不需要小括号包裹语句 for initialization; condition; post { // 零个或多个语句 }
-
for
可以省略init
和post
部分,只采用condition
,这类似于while
循环:for condition { // ... }
-
for range
循环,range
每次迭代产生一对值:索引和索引处元素的值:for _, val := range os.Args[1:]
-
空标识符:
_
,用于语法上需要变量,而逻辑上不需要变量的情况; -
strings.Join(s, " ")
可将s
中的字符串使用空格 -
time
包提供了时间处理相关接口,当前可以记住time.Now()
获取当前时间,time.Time.Sub()
计算时间差;
找出重复行
if
的条件部分不放在圆括号中;map
存储键值对,键是能进行==
比较的任意类型,值可以是任意类型;使用make()
函数创建map
:make(map[string]int)
;bufio
包可以简便高效地处理输入输出;bufio.Scanner
可以读取输入,以行或者单词断开输入;通过bufio.NewScanner()
创建一个扫描器;bufio.Scanner.Scan()
读取下一行(读取失败时返回false
),bufio.Scanner.Text()
获取读取到的内容;fmt.Printf()
支持的转义字符:%d %x %o %b
进制整数,%T %v
值类型和内置值,%s %q
不带引号和带引号的字符串,%t
布尔值;fmt.Printf()
等以f
结尾的函数可以使用%
字符格式化输出;ln
结尾的函数使用%v
方式格式化参数,并最后换行;map
是一种引用类型,子函数中修改map
后会在函数外生效;- 读取文件采用
os.Open()
函数,返回os.File, error
; os.Open()
是流式读取文件内容;ioutil.ReadFile()
可以读取整个文件的内容;类似还有ioutil.WriteFile()
写入文件;os.Write()
写入文件;strings.Split()
是strings.Join()
的反操作;
GIF动画
const
声明常量,在编译期间就固定了值;常量必须是数字、字符串或布尔值;handler := func(){}
声明函数变量;
获取一个URL
net/http
包用于提供了http.Get()
方法,以请求个给定的url
;返回http.Response, error
ioutil.ReadAll()
可以读取一个io.Reader
中的所有内容,典型为http.Response.Body
;
并发获取多个URL
Body
读取完后记得调用Close()
方法,避免资源泄露;io.Copy(ioutil.Discard, resp.Body)
可以丢弃Body
;time.Since(start).Seconds()
,快速计算消耗时间;- 通过
go function()
启动一个goroutine
; chan
类型用于并发通讯,使用make(chan string)
创建储存string
类型的通道;chan
使用<-
运算符来存/取通道中的数据,箭头指向chan
存储,否则取出;- 可以指定只存储的通道:
chan<-
,在函数传参时十分好用;
一个Web服务器
fmt.Fprintf(w, "format", value)
向指定位置w
输出;http.HandleFunc(path, handler)
指定请求路径path
时调用handler
来响应;- 通过
http.Request.URL.Path
获取访问路径,路径值为监听地址后包括/
的部分; - 同步锁
sync.Mutex
,通过mu.Lock()、mu.Unlock()
来加锁/解锁; - 获取请求中的表单数据:先
r.ParseForm()
,随后通过r.Form
获取;r.Form
是一个map[string][]string
;r.Header
也类似; - 在浏览器中输入
ip:port?key1=val1&key2=val21,val22
即提交Form
数据:使用?
表示表单数据开始,数据之间采用&
连接; Go
允许一个简单语句跟在if
条件的前面,如err
声明,可以缩小err
作用域;
其他内容
switch
语句自动break
,可以使用fallthrough
改写这个行为;switch
语句可以不带操作数,此时每条case
语句都是一个布尔表达式;type
声明给已有的类型命名,如type Point struct {}
;Go
中的指针:可以使用*
获取指针引用的变量值,使用&
获取变量地址;但指针不支持算术运算;- 一个关联了命名类型的函数被称为方法:
func (d Point) ToString() string{}
;
如有错误 ❌ ,欢迎指正 ☝️~
如有收获 🍗,可以考虑点赞👍/评论💬/收藏⭐️/关注👀,大家共同进步~