Go基础入门 | 青训营笔记

396 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

本文同步发布于博客(xblc.netlify.app),如果有更新博客会在第一时间更新

主要参考圣经 gopl.io 和字节青训基础课

介绍

package main

import "fmt"

func main() {
    fmt.Println("Hello, 世界")
}

主要介绍:

  • 编译型语言。高性能,高并发。

    • 和C一样导入包(packages),类比C中的库(libraries)
    • 统一用 go 命令运行、编译
    • 编译速度吊打C++
    • 性能要求严格,如变量或者包没使用的话没法过编译
  • 强调轻量性、简单性(代码强制统一格式化)

  • 适合用于并发编程(减少复杂性)

和C的基础区别:

  • 主要函数是一个 “main包” package main
  • 分号不是必要的。但是也可以加上,表示一个语句的结束
  • Go语言比较有“强迫症”,格式规范很严格,很多简写都写不了,语句基本的都是独一无二的,没有第二种写法

其他特性:

  • 标准库非常丰富。不需要依靠性能没有保障的第三方库就能完成大部分开发。
  • 完善的工具链。诞生之初就设计好了格式化、单元测试框架、代码补全等工具。
  • 静态链接。编译之后得到的可执行文件可以 All-in-One,所有代码和库都静止在一个文件里面。
  • 跨平台。能够在各种奇怪平台上运行。
  • 垃圾回收。自动的代码优化,不要考虑内存释放。可以理解为不适合底层学习但是又有许多性能优化,有点C到Python的一个折中的感觉。

基础语法

变量和控制

变量:

  • 变量类型的指定

  • var声明变量

    • 自动变量类型,可以不声明但一定要有值
      • := 赋值,同 Matlab 和 Pascal
    • 后跟变量类型的指定
    • 然后才是赋值
var a = "ss"
var c, d int = 3, 5
fmt.Println(a, c, d)

// b = "ss";
b := 3
fmt.Println(b)

条件:

  • if 无括号
  • Switch 不会顺次执行

实测 for 后面接一个条件或者三个条件

for i := 1; i < n; i++ {}
for j <= 3 {}

t := 5
for ;t > 0 ; t-- {}

(条件一定要写不等式;代码段一定要打括号)

数组和切片

数组:长度固定

依次验证

  1. 会把值初始化为 0
  2. 可以直接输出一整个数组,注意数组直接表示出来的话一定要前置类型 “二维数组” [][]int
  3. 不允许在声明时赋值定义二维数组的值
var arr [5]int 
fmt.Println(arr[1], len(arr))

arr1 := [][]int{{1, 1}, {1, 0}}// auto size is allowed
fmt.Println(arr1)
//[[1 1] [1 0]]

// arr2 := {4, 1, 4} !
// var arr2dem [3][2]int = {1, 3, 1, 5} !
// var arr2dem [3][2]int{1, 3, 1, 5} !
// var arr2dem [3][2]int{{3, 4}, {1, 4}, {4, 1}} !
// var arr2dem [3][2]int = [][]int{{3, 4}, {1, 4}, {4, 1}}
// cannot use ([][]int literal) (value of type [][]int) as [3][2]int value in variable declaration
// fmt.Println("arr2 = ", arr2dem)

切片

  1. make()append() 函数均用来返回一个数据类型
  2. []string 表示字符串数组类型,如果没有初始化的话不是空字符而是空格
sl := make([]string, 3)
	
// append(sl, "111")
sl = append(sl, "111")

fmt.Println(sl)
//[   111]
fmt.Println(sl[3])
//[111]

str_arr := []string{"aa", "bb"}
fmt.Println(str_arr)

函数和结构体

函数

  1. 返回类型后置
  2. 经常返回多个类型。第一个表示真正返回值,第二个表示状态

结构体

  1. 结构体方法:类比类成员函数。
    1. 使用方法是前函数前置

字符串

操作:

格式化:

  • 详细和非常详细式输出

其他

map

  1. 初始化会是 0, false 这些
  2. 完全无序,偏随机

range

  1. 同时表示 key 和 val,可以和 for 结合使用 for key, val := range arr/map

指针

  1. 作用非常有限
  2. 操作方式和C一样

常用包

JSON 处理

  • 序列化和反序列化 json.Marshal
  • 注意进行 string() 类型处理
  • 输出风格规定?

错误处理

时间处理

  • 导入包以后就可以直接向结构体一样使用一个时间类型,用一些函数来操作时间
  • 可以按照 yy-mm-dd hh:mm:ss 的格式来解析or格式化一个时间串
  • 时间戳

数字解析

  • 解析格式:字符串,进制,精度

进程信息

  • 获取命令行参数
  • 获取写入环境变量
  • exec获取什么得到输入输出