6.824lab预备篇:go tour

本文是Go Tour的学习记录,涵盖了Go语言的基础、控制流、类型、slice、map、函数、方法、接口和并发特性。重点讨论了并发的goroutine、channel以及并发控制中的select和sync包的使用。同时,提到了在并发爬虫问题中的解决方案和对slice容量变化的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

go tour可以运行在本地,但是因为我一般都是用vscode remote 而且运行

go get golang.org/x/tour

的时候提示 connection refused,所以还是在网页上做,这里会记录一些值得留意的东西:

热身

  • 在线版go tour是建立在go playground上的,有一些特别之处:他的时间总是从2009-11-10 23:00:00 UTC开始,而且对执行时间,以及cpu和内存的使用有一些限制,并且不能访问外部网络主机(那爬虫?)
  • 在线版go tour的运行环境是确定的(恒定?),所以每次rand.intn都会返回同样的数(当然不是指每一个rand.Intn返回的结果都相同:

如:

    fmt.Println("My favorite number is", rand.Intn(10),rand.Intn(10))

每次都会输入1,7

基础

  • 每个go程序由一系列包组织而成
  • 程序从名为main的包开始运行
  • 在import语句中,import path中的最后一个元素是包的名字,例如math/rand,rand是包的名字(那math呢?是包嘛?)
  • 引进包时,既可以所有包放在一个小括号里,也可以每个包一个import,但是推荐前一种
  • go中,如果一个变量(常量?)以大写字母开头,那么他是导出的,即该变量所在的包被引用时,该变量可以被使用,如果不是大写字母开头,就不是导出的
  • go中定义函数的风格:

func add(x int, y int) int {
    return x + y
}

关于为什么类型在后面:https://blog.golang.org/declaration-syntaxTOREAD)

  • 函数形参中,如果有两个或两个以上的类型相同,可以只写最后一个的类型
  • go中函数可以返回任意数量的返回值
  • go的返回值可以是有名字的,这些命名了的返回值是作为函数内的顶级变量,对返回值的明明应该反映其含义,如果return语句后面没有参数,那么就是返回命名了的返回值,但这种做法近应该在短小的函数中使用,因为这种做法会影响可读性
  • var语句可以声明一系列变量,同样,类型在最后,var可以在函数内(function level),也可以在函数外(package level)
  • var可以同时初始化变量,每个变量一个初始化的值,如果提供了初始化值,那么可以省略类型,go会使用初始化值的类型作为变量的类型,但也可以不忽略,如:

    var a int =1

  • 在函数内,可以用:=声明并初始化变量,同样的,从初始化值的类型推断变量类型,但在函数外,任何语句都需要以关键字开头,因此不能用短变量声明:=
  • go的基本数据类型:并且printf时,%T可以输出类型,%v可以输出值(任何类型?);并且官方推荐除非有特殊需要,否则使用int,而不是int64/int32,int类型在32/64位上分别是32/64

bool

string

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr

byte // alias for uint8

rune // alias for int32
     // represents a Unicode code point

float32 float64

complex64 complex128

  • 没有初始化的变量被赋予该类型的零值,boolean是false,string是""(空串)
  • 和c一样,可以使用type(v)进行类型转换,但是必须是显式的类型转换
  • 用const语句定义常量

控制流

  • go只有一个循环语句:for,for不需要小括号, 但是永远需要大括号。同样,for的三个部分都是可选的

    for i := 0; i < 10; i++ {
        sum += i
    }

  • 用for实现while,就是只取中间的部分,此时可以不要左右的分号(md死循环机器差点卡死
  • if和for一样,不需要小括号,但是必须要大括号
  • 同样,if里也可以用一个:=声明一个局部变量,作用域只存在于if内
  • go中的switch,只运行匹配的case,不进行fall through,并且case不需要是常量,也不需要是integer
  • switch 后面可以不接变量,如:

    t := time.Now()
    switch {
    case t.Hour() < 12:
        fmt.Println("Good morning!")
    case t.Hour() < 17:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值