前言
本专栏是笔者在学习《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, errorioutil.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{};
如有错误 ❌ ,欢迎指正 ☝️~
如有收获 🍗,可以考虑点赞👍/评论💬/收藏⭐️/关注👀,大家共同进步~
本文是作者学习《Go程序设计语言》的笔记,涵盖了Go语言的基础知识,如helloworld、处理命令行参数、并发获取URL、构建Web服务器等。通过实例介绍了Go的语法特性,如切片、map、并发控制及HTTP客户端和服务器的使用。
1403

被折叠的 条评论
为什么被折叠?



