学习go基础时的小记

83 阅读3分钟

day1_1:

1.Go语言中,package是一个编译单元。同一个package下的文件在编译时会合并在一起,如果import了相同的包,会在编译时报重复导入的编译错误。
2.fmt.Println(u) //这里使用了一个语法糖,在go中可以自动识别u的类型,不需要写成fmt.Println(*u),就可以输出u的值(此处的变量u是一个指针)

day1_2_1

1.个别常见包总结:
    "bufio" //这个 package 用来读取用户的输入
    "os"      //用来获取用户输入
    "strconv" //字符串和int转换
2.time.Now().UnixNano()将当前时间转换为Unix时间(自197011日以来的秒数+纳秒偏移量)。
  rand.Seed()用来设置rand包的全局种子,只需要调用一次。
  由于rand.Seed()之所以在1.16版本被弃用,是因为它不是线程安全的。在1.16版本中,rand.Seed()被替换为rand.NewSource()。
  
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)


// 最新写法
// 创建随机数源
seed := time.Now().UnixNano()
source := rand.NewSource(seed)
// 创建随机数生成器
r := rand.New(source)
// 生成随机数
secretNumber := r.Intn(maxNum)
3.在不同的操作系统上,换行符表示有些差异:
    在 Linux/Unix 系统中,换行符是 \n
    在 Windows 系统中,换行符是 \r\n,其中 \r 是回车符,\n 是换行符
    在 Mac OS 中,older版本使用 \r 作为换行符,现代版本使用 \n 作为换行符
//windows去掉换行符
input = strings.TrimSuffix(input, "\r") //去掉最后的\r
input = strings.TrimSuffix(input, "\n") //去掉最后的\n
guess, err := strconv.Atoi(input)       //将input转换为整数
4.fmt.Scanln()会阻塞程序的执行,直到用户按下回车键,然后将用户输入的内容读取出来。类似于c语言中sys
// 使用fmt.scanf()函数来读取用户的输入
var input string
//为了防止缓冲区存有上一次的输入的参与内容,用\n来清空缓冲区
_, err := fmt.Scanf("%s \n", &input)

day1_2_2

1.go语言中``用来表示字符串,而''表示rune类型的字符字面量,rune类型是int32的别名,用来表示unicode编码的字符
2.defer的作用是在函数结束时关闭流,这里的流是resp.Body,也就是响应体,如果不关闭的话,会造成内存泄漏,会从下往上依次关闭
3.这里的bodyText是一个字节数组,需要转换成字符串,才能输出,使用%s进行格式化输出
fmt.Printf("%s\n", bodyText)
4. %#v是用来输出结构体的,%v是用来输出基本类型的,最详细的输出格式
5. os.Args是一个字符串切片,里面存储的是命令行参数,第一个参数是程序的名字,之后的参数是用户输入的参数
if len(os.Args) != 2 {
    //下面这句话是用来输出错误信息的,这里的os.Stderr是一个文件,是标准错误输出,fmt.Fprintf()是用来格式化输出的,第一个参数是文件,第二个参数是格式化字符串,之后的参数是格式化字符串中的参数
    fmt.Fprintf(os.Stderr, `usage: simpleDict word example: simpleDict hello`)
    os.Exit(1)
}

day1_2_3

1.panic(err)的作用是中断程序的执行,如果不加这个,程序会继续执行下去,括号内的内容会输出到控制台
if err != nil {
panic(err)