《Go程序设计语言》- 第1章:入门

本文是作者学习《Go程序设计语言》的笔记,涵盖了Go语言的基础知识,如helloworld、处理命令行参数、并发获取URL、构建Web服务器等。通过实例介绍了Go的语法特性,如切片、map、并发控制及HTTP客户端和服务器的使用。
摘要由CSDN通过智能技术生成

前言

本专栏是笔者在学习《Go程序设计语言》这本书时,对每个章节认为较为重要容易忘记👻)的知识点记录的笔记,其中也会有少量的思考👀, 现整理成博客分享出来。

❗️注意❗️:本专栏不是详细的知识讲解,只是碎片的知识条目,或可作为Go知识点查漏补缺的小工具~

hello world

  1. go run xxx.go:将一个或多个go后缀的源文件进行编译、链接,然后运行生成的可执行文件;
  2. Go原生地支持unicode,它可以处理所有国家的语言;
  3. go build xxx.go:生成二进制程序;
  4. Go代码是使用来组织的,类似于其他语言的库和模块;一个包由一个或多个.go文件组成,放在一个文件夹中;
  5. 每个源文件的开始都用package声明,指明这个文件属于哪个包;后面跟着它导入的其它包列表,通过import指定,且必须跟在package之后;
  6. main包用来定义一个独立的可执行程序,而不是库;其中的main函数是程序执行的入口;
  7. 大部分情况,函数、变量、常量、类型的声明顺序是没有关系的;
  8. Go语句不需要分号结尾,除非多个语句在同一行;
  9. gofmt工具可将代码以标准格式重写;goimports工具可以按需管理import的其它包;

命令行参数

  1. os.Args变量获取命令行参数,它是一个字符串的切片(slice),可以通过len()函数获取长度;

  2. 对于slice可以使用s[m:n]语法再取切片,其中0<=m<=n<=len(s),左闭右开取值;

  3. Go只有后自增,且不是一个表达式,意味着这些都是不允许的:j = i++; --i

  4. forGo里面唯一的循环语句,形式很多,其中之一是:

    // 不需要小括号包裹语句
    for initialization; condition; post {
    	// 零个或多个语句
    }
    
  5. for可以省略initpost部分,只采用condition,这类似于while循环:

    for condition {
    	// ...
    }
    
  6. for range循环,range每次迭代产生一对值:索引和索引处元素的值

    for _, val := range os.Args[1:]
    
  7. 空标识符_,用于语法上需要变量,而逻辑上不需要变量的情况;

  8. strings.Join(s, " ")可将s中的字符串使用空格 拼接起来,效率很高;

  9. time包提供了时间处理相关接口,当前可以记住time.Now()获取当前时间,time.Time.Sub()计算时间差;

找出重复行

  1. if的条件部分不放在圆括号中;
  2. map存储键值对,键是能进行==比较的任意类型,值可以是任意类型;使用make()函数创建mapmake(map[string]int)
  3. bufio包可以简便高效地处理输入输出;bufio.Scanner可以读取输入,以行或者单词断开输入;通过bufio.NewScanner()创建一个扫描器;
  4. bufio.Scanner.Scan()读取下一行(读取失败时返回false),bufio.Scanner.Text()获取读取到的内容;
  5. fmt.Printf()支持的转义字符:%d %x %o %b进制整数,%T %v值类型和内置值, %s %q不带引号和带引号的字符串,%t布尔值;
  6. fmt.Printf()等以f结尾的函数可以使用%字符格式化输出;ln结尾的函数使用%v方式格式化参数,并最后换行;
  7. map是一种引用类型,子函数中修改map后会在函数外生效;
  8. 读取文件采用os.Open()函数,返回os.File, error
  9. os.Open()是流式读取文件内容;ioutil.ReadFile()可以读取整个文件的内容;类似还有ioutil.WriteFile()写入文件;os.Write()写入文件;
  10. strings.Split()strings.Join()的反操作;

GIF动画

  1. const声明常量,在编译期间就固定了值;常量必须是数字、字符串或布尔值
  2. handler := func(){}声明函数变量;

获取一个URL

  1. net/http包用于提供了 http.Get()方法,以请求个给定的url;返回http.Response, error
  2. ioutil.ReadAll()可以读取一个io.Reader中的所有内容,典型为http.Response.Body

并发获取多个URL

  1. Body读取完后记得调用Close()方法,避免资源泄露;
  2. io.Copy(ioutil.Discard, resp.Body)可以丢弃Body
  3. time.Since(start).Seconds(),快速计算消耗时间;
  4. 通过go function()启动一个goroutine
  5. chan类型用于并发通讯,使用make(chan string)创建储存string类型的通道;
  6. chan使用<-运算符来存/取通道中的数据,箭头指向chan存储,否则取出;
  7. 可以指定只存储的通道chan<-,在函数传参时十分好用;

一个Web服务器

  1. fmt.Fprintf(w, "format", value)向指定位置w输出;
  2. http.HandleFunc(path, handler)指定请求路径path时调用handler来响应;
  3. 通过http.Request.URL.Path获取访问路径,路径值为监听地址后包括/的部分;
  4. 同步锁sync.Mutex,通过mu.Lock()、mu.Unlock()来加锁/解锁;
  5. 获取请求中的表单数据:先r.ParseForm(),随后通过r.Form获取;r.Form是一个map[string][]stringr.Header也类似;
  6. 在浏览器中输入ip:port?key1=val1&key2=val21,val22即提交Form数据:使用?表示表单数据开始,数据之间采用&连接;
  7. Go允许一个简单语句跟在if条件的前面,如err声明,可以缩小err作用域;

其他内容

  1. switch语句自动break,可以使用fallthrough改写这个行为;
  2. switch语句可以不带操作数,此时每条case语句都是一个布尔表达式
  3. type声明给已有的类型命名,如type Point struct {}
  4. Go中的指针:可以使用*获取指针引用的变量值,使用&获取变量地址;但指针不支持算术运算
  5. 一个关联了命名类型的函数被称为方法func (d Point) ToString() string{}

如有错误 ❌ ,欢迎指正 ☝️~

如有收获 🍗,可以考虑点赞👍/评论💬/收藏⭐️/关注👀,大家共同进步~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值