Golang知识训练合集
start包
- %d(十进制) 如:60 的十进制写法 60
- %b(二进制) 如:60 的二进制写法 111100
- %x(十六进制a-f) 如:60 的十六进制写法 3c
- %X(十六进制A-F) 如:60 的十六进制写法 3C
- %#x(0x开头,十六进制a-f) 如:60 的十六进制写法 0x3c
- %#X(0X开头,十六进制a-f) 如:60 的十六进制写法 0X3c
- %q(单引号括起来的go语法字符字面值) 如:60 的字符字面值法 '<'
amain包
- 调用:函数名()
- 要求:需要注意此时对标识符(函数名)的首字母无要求
- 调用:包名.函数名()
- 要求:需要注意此时对标识符(函数名)的首字母需要大写
variables包
- 使用关键字 “var”
- “:=” 运算符
- 变量的作用域(全局变量:在函数外部声明可以在多个函数内部使用;局部变量:在函数内部声明只在该函数内部使用)
- 双引号"":里面可以是单个字符也可以是字符串,双引号里面可以有转义字符,如\n、\r等,对应go语言中的string类型
- 单引号'':单引号在go语言中表示golang中的rune(int32)类型,单引号里面的单个字符,对应的是该字符的ASCII码
- 反引号``:像双引号一样工作,但是对转义字符无效,内容按照原格式输出
scope包
- 需要注意标识符(变量名和函数名)的首字母大小写问题
- 作用域:在该函数内部
- 函数中声明-作用域:在该函数内部
- 函数内-新的{}中声明-作用域:在{}内部
- 作用域:该包下的所有.go文件中均可使用
- 注意:因为是同一包下的.go文件使用,所以全局变量首字母无需大写
- 没有名称的函数
- 匿名函数可以赋值给变量(函数表达式:将函数赋值给变量)
- 闭包帮助我们限制多个函数使用的变量作用域,如果没有闭包,两个或多个函数要访问同一个变量,该变量需要是包作用域
- 针对函数内部声明的变量而言,必须先声明,然后再使用
- 针对函数内部使用函数外部声明的变量时,变量声明所在行(位置顺序)不重要,代码编译时,会优先编译全局变量,然后编译函数
- 变量与函数同名,函数赋值给变量后,此时标识符表示的是变量。
blank包
- 在go语言中,声明而不使用的变量,会报错
- 下划线 _:是一个特殊的标识符,被用作占位符。
- 在不需要使用变量的地方,可以使用下划线作为变量名,这样可以避免编译器报出未使用变量的警告,同时也表明了这个变量是不需要使用的。
- 下划线还可以用于多个返回值的函数或方法中,当我们只需要其中的某些返回值时,可以使用下划线来忽略不需要的返回值,而只关心需要的返回值。
constants包
- 常量是一个简单不变的值
- 使用关键字const声明
- iota是go语言的常量计数器,只能在常量表达式中使用,例如:const a = iota //0
- iota在const关键字出现时将被重置为0,const中每新增一行常量声明将使iota计数一次 可理解为const语句块中的行索引。
例如:
const a = iota //0
const b = iota //0
const (
c = iota // 0
d = iota // 1
e = iota // 2
)
- 左移运算符(<<)将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边的补0)
例如:
KB = 1 << (iota * 10) // 1 << (1 * 10)
KB = 1<<10 // 1的二进制是 1 ,左边舍弃10位,右边补上10个0 得到:100 0000 0000,将100 0000 0000 转换为十进制是 1 * 2^10 = 1024
KB= 1024
address包
- &:取地址符
- 使用&获取变量的地址输出的是十六进制数
- 内存地址的使用:fmt.Scan(&变量),Scan从标准输入扫描文本,将成功读取的空白分隔的值保存进成功传递给本函数的参数
pointers包
- &:取地址符
- *:根据地址取值运算符(根据地址取出指向的值)
- 总结:对变量进行取地址(&)操作,可以获得这个变量的地址(指针变量)
- 总结:指针变量的值是原变量的地址
- 总结:对指针变量进取取值(*)操作,可以获得指针变量指向的原变量的值。
- Go语言指针学习地址:https://blog.csdn.net/weixin_44211968/article/details/121343717
forloop包
- for循环可以初始化循环条件i,例如:for i:=0;i<=10;i++{}
- for循环可以嵌套
- for循环可以写成while的方式(带循环条件),例如:i:=0 for i<10{i++}
- for循环可以写成while的方式(不带循环条件,变成死循环),例如:i:=0 for {i++}
- for循环可以写成while的方式(不带循环条件,变成死循环,但使用break可以结束循环),例如:i:=0 for {if i>=10{break} i++}
- for循环可以写成while的方式(不带循环条件,变成死循环,但使用break可以结束循环,加上continue可以跳过一次循环,开始下次个循环),例如:
i := 0 for { i++ if i%2 == 0 { continue } fmt.Println(i) if i >= 50 { break } }
- "string()" 可以把int类型的参数转换为string类型,并且输出参数(数值)对应的ASCII码,UTF-8是Go使用的文本编码方案。
- "[]byte()" 可以把string类型的参数转换为[]uint8类型的切片,比如," []byte("T") ",输出为:" [84] ",数值84对应的ASCII码是T
switchstatements包
- 语法:
switch 表达式{ case 条件1: 代码块 case 条件2: 代码块 default 代码块}
- fallthrough的用法:用于穿透switch,当switch中某个case匹配成功之后,就执行该case语句,如果遇到fallthrough,那么后面紧邻的case无需匹配, 执行穿透执行。fallthrough应该位于某个case的最后一行
- case后面同时具有多个条件:
switch 表达式{ case 条件1,条件2: 代码块 case 条件3: 代码块 default 代码块}
- switch后面可以没有表达式:
switch { case 条件1: 代码块 case 条件2,条件3: 代码块 default 代码块}
- switch中允许使用变量的类型:
switch x.(type){//这是一个断言;断言"x是这种类型" case int: 代码块 case string: 代码块 case 结构体类型 代码块 default 代码块}
ifelse包
- 判断条件为真,就是true
- if 条件为真,则执行紧邻if的{}中的代码
- 判断条件为假,就是false
- if 条件为假,则执行else的{}中的代码
- 语法:
b := true if food := "apple"; b { fmt.Println(food) } ……
- 表达式中初始化的变量的作用域:变量food的作用域在 if else 分支语句中
- if
- if | else
- if | else if | else
- if | else if | else if | else
solution包
- fmt.Println() 返回2个结果,第1个结果表示写入标准输出的字节数,第2个结果表示写入标准输出的错误。
- fmt.Println("Hello") 打印参数"Hello"
- fmt.Println("Hello"[1]) 打印参数"Hello"的第2个元素e对应的ASCII码 101
- 输出参数后,不换行
- 参数:"&变量"
- 可以通过终端输入,为变量赋值
- 例如:4%2 输出 0
- 条件为真时,if
- 条件为假时,else
- for 循环可以声明循环变量i:=0;加上循环条件i<=100;i++
- a:=0 a+=1 //a此时为1
function包
- main()函数是程序的入口
- 参数的类型可以是任意类型
- 参数的个数可以是1个,可以是2个
- 参数的个数大于2个,并且是同类型时,可以省略第一个参数的类型,只写最后一个参数的类型
- 函数的参数可以是可变的,语法:func test(sf ...int),此时sf的类型是切片。在调用此函数时,需要传入多个参数test(1,2,3)或者传入一个切片,test([]{1,2,3}...)
- 函数的参数可以是切片类型的,语法:func test(sf []int),调用方式test([]{1,2,3})
- 函数可以返回一个指定类型的值
- 函数的返回值,可以命名为一个变量,但是要避免这样使用
- 函数可以返回多个值
- 函数或者匿名函数可以作为表达式,赋值给一个变量。 当函数或者匿名函数作为表达式赋值给一个变量时,这个变量的类型是:func()
- 函数的返回值也可以是一个(匿名)函数类型
- 闭包帮助我们限制没有闭包的多个函数使用的变量的作用域,对于两个或多个函数访问同一个变量,该变量需要是包作用域
- 闭包 = 函数 + 引用环境
- 函数体内嵌套了另外一个函数,并且返回值是一个函数
- 内层函数被暴露出去,被外层函数以外的地方引用着,形成了闭包。
- 闭包每次返回都是一个新的实例,每个实例都有一份自己的环境。
- 同一个实例多次执行,会使用相同的环境。