Go 基本概念速记速查之数据类型、函数、错误处理

date
Mar 16, 2022
slug
golang-start-datatype-func-error
status
Published
tags
Go
summary
Go 基本概念汇总速记
type
Post

基本数据类型

没有明确初始化的变量都默认有个零值
 

变量

通过 var 声明变量,相同类型变量可以放一排,然后最后指定类型
按位置顺序赋值
 

全局变量和局部变量

短变量声明 := 只有在方法内才可以使用,称为局部变量 ,方法外声明的只能用 var 定义,称为全局变量
 

常量

定义常量使用 const 关键字,且不能使用 := ,只能用 var,常量类型只允许布尔型、数字型(整数型、浮点型和复数)和字符串型
 

字符

go 没有单独的字符类型,可以用 byte 代替,不过赋值进去的是字符,而用 %v 输出的是数值,因为 byte 就是 int8 的别名,想要输出字符,需要用 %c 来格式化
同理反过来说也可以把一个 uint8 按照字符输出
 

字符串

可以使用 `` 来表示字符串,该字符串内部的字符会原样输出
大部分字符串常用函数都在 strings 包中,例如 Index Replace Split Trim HasPrefix HasSuffix
 

类型转换

必须显示转换,不存在自动的隐式转换
类型推断的精度取决于赋值的量本身的精度
 
数值转字符串
可以使用 fmt.Sprintf 配合不同的格式化占位符做展示,占位符列表在这里 https://pkg.go.dev/[email protected]#hdr-Printing
常用的有
 
字符串转数值
可使用标准库 strconv 转换字符串到其他类型
转数值时,ParseInt 第一个参数是字符串,第二个参数 base 是指明原字符串采用几进制,第三个参数 bitSize 表示原字符串可以用多少位 bit 存下,如果实际字符串长度超出传入的 bitSize 数组,则会发生溢出,转换后的结果会将溢出部分舍弃,只保留bitSize 个 bit 的最大值,最后再转成 int64 返回,而溢出的具体信息放在返回值 e 中。
浮点型转换,注意精度问题
 

函数

定义一个函数
如果参数类型相同,可以省略前面几个参数类型,只保留最后的类型
多个返回值
函数闭包
用闭包实现 Fibonacci
 

流程控制

for

go 只有一种循环,for 有三种组成部分,初始化语句,条件表达式,后置语句,中间用 ; 分隔,初始化和后置语句不是必须的。for 语句没有小括号,但是循环体需要 {}
省略初始化和后置语句
省略分号,就变成了 while 循环
再省略掉条件语句,就变成了 while 死循环
 

for range

range 子句可以遍历字符串,数组,切片,字典或 channel
注意在遍历字符串时,for range 会按照字符遍历,但索引值会按照字节数递增。
 

if

if 语句不需要小括号,但必须有 {}
if 支持一个初始化语句,在判断之前执行,初始化的变量只在当前 if 作用域内有效
 

switch case

同样支持初始化语句,go 只会运行第一个匹配的 case,不会继续向下执行,即相当于每一个 case 自带了一个 break,另外 cases 的值可以是任意类型而不必是数字,这两点跟其他语言不一样。
不写 switch condition 就相当于 switch true,也就是判断下面哪个 case 是 true,相当于变相的 if else 组合
 

错误处理

defer 关键字兜底逻辑

defer statement pushes a function call onto a list. The list of saved calls is executed after the surrounding function returns. Defer is commonly used to simplify functions that perform various clean-up actions.
延迟执行,直到函数返回之后执行被 defer 的语句。被 defer 的函数调用其参数会立即求值,但函数需要等到整个函数都执行完才会调用。
多次 defer,每一个 defer 都相当于压栈操作,最后执行的时候按照后进先出的出栈顺序执行。
defer 三个特点:
  • 被 defer 的函数的参数会立即求值
    • defer 的调用会压入栈内,在最后执行时按照后进先出顺序执行
      • defer 的函数体中可以读取原函数的名字参数,并且还可以给其赋值。这个特点便于修改函数的错误返回值,比如官方 json 库使用 defer 结合 panic recover 来捕获递归调用中出现的异常,在最外层统一处理错误并返回
        defer 常用于打开文件后记得关闭文件、加锁之后记得解锁等等这种需要回收资源或是需要收尾的工作。
        官网blog介绍 defer panic recover :https://go.dev/blog/defer-panic-and-recover
         

        panic 抛出异常

        Panic  is a built-in function that stops the ordinary flow of control and begins panicking . When the function F calls panic, execution of F stops, any deferred functions in F are executed normally, and then F returns to its caller. To the caller, F then behaves like a call to panic. The process continues up the stack until all functions in the current goroutine have returned, at which point the program crashes. Panics can be initiated by invoking panic directly. They can also be caused by runtime errors, such as out-of-bounds array accesses.
        有点类似异常的意思,出现异常时调用 panic(xxx) 会中止当前函数的流程,而当前函数设置的 defer 则会逐一执行,然后函数返回给调用方,对调用方来说也相当于触发了 panic,一路向上抛出,直到有一个函数使用 recover 捕获 panic,至此不再向上抛出。
         

        recover 捕获异常

        Recover  is a built-in function that regains control of a panicking goroutine. Recover is only useful inside deferred functions. During normal execution, a call to recover will return nil and have no other effect. If the current goroutine is panicking, a call to recover will capture the value given to panic and resume normal execution.
        recover 能够接到 panic 的内容,比如函数调用 panic(123),上层函数 r := recover() 可以接到 这个 123。如果没有 panic 则 r = nil。recover 后,panic 就不会再向上抛出了,相当于捕获住了。
        recover 只能在 defer 关键字作用域内有效。
        defer panic recover 组合

        © 菜皮 2020 - 2023