这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
Go语言的重要语法
-
switch:语法结构与其他语言类似
- 不需要单独书写break语句,已内置
- 若需要使用break,可以在case中添加fallthrough(穿透)—不推荐使用
- switch后面不一定非要常量、整型、布尔型,也可以是表达式,只要表达式的结果是相同类型的就可以:switch {case 表达式:}也成立
- switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型??????。
-
for循环
-
三种形式
- for 初始条件;循环条件;增量{}——等同于其他语言的for
- for 循环条件{}/for ;循环条件;{}—等同于while
- for{}—死循环
-
for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。—foreach
strings := []string{"孙", "Baidu"}for i, s := range strings { fmt.Println(i, s)} -
字符串的迭代(处理中文乱码问题)
-
for range遍历很智能,默认是使用字符的方式遍历,因此字符串有中文,也可以遍历
-
若使用一般形式,需要先转为数组才能遍历
string := "孙尚晴"str := []rune(string)for _, i2 := range str { fmt.Printf("%c", i2)}
-
-
-
while和do while
-
while
循环变量初始化 for{ if 循环判断语句{ break //跳出for循环 } 循环操作 循环变量迭代 } or for 循环判断{ 循环操作 }
-
do while循环变量初始化 for{ 循环操作 循环变量迭代 if循环条件表达式{ break //跳出for循环 } }
-
-
break、continue、goto、return
-
break
- 调出循环:for or 多重循环
- 调到label
-
continue
- 跳过当前循环,到下一轮,for增量
- continue label
-
goto:不推荐使用
-
return:跳出函数
-
-
Python中的循环和字符串遍历
for i in range(2,10,2)—2,4,6,8- 字符串遍历无需担心乱码问题
- while后面存在else
函数、init函数和包
-
函数的基本定义
-
语法格式
func 函数名(参数列表,用逗号分割)(返回值列表){ 函数体 }**parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。****return_types:返回类型,函数返回一列值。return_types是该列值的数据类型。有些功能不需要返回值,这种情况下return_types不是必须的。可以有返回值,也可以没有**
-
return:
- 如果返回多个值时,在接受时,希望忽略某个返回值,则使用
_表示忽略 - 如果返回值只有一个,返回值类型列表可以不写
()
- 如果返回多个值时,在接受时,希望忽略某个返回值,则使用
-
函数调用:使用函数名,并传参
-
递归调用:理解底层栈的思维
- 执行一个函数的时候,就创建了一个受保护的独立空间(新函数栈)
- 函数的局部变量是独立的,不会相互影响
- 递归要有出口,否则无线递归
- 函数执行完毕或者遇见return会遵守谁调用,就将返回结果给谁,同时,当函数执行完毕时,或者返回时,该函数本身也会被系统销毁(栈先进后出)
-
-
包
-
作用
- 区分相同名字的函数、变量等标识符
- 当程序文件很多时,可以很好的管理项目
- 控制函数、变量等访问,即作用域
-
使用
-
打包:package main
-
引包:import
-
调用:只有大写字母才能被导出
-
注意
-
包的路径:是从项目文件夹里面的第一层文件开始的,到该包(mod包不是)
-
包名最好和文件夹名保持一致。
-
打包指令放在第一行,然后是
import指令,然后是函数的执行 -
如果包名比较长,Golang支持给包起别名,但是起别名之后原来的包不能使用
import ( "fmt" newutil "go_code/chapter/fundemo01/util" ) //注意:此时原来的包util不能再用了 -
如果两个相同函数名不在一个文件,但是在同一个包下,此时也会报错,即一个包下可以有多个文件
-
**main包只有一个,而且只能是main可以形成可执行文件**
-
-
-
-
值传递&引用传递
-
默认值传递,即使是数组也是值传递(与JAVA不同)
-
引用传递可以用指针*实现(没有学的切片和map也能够实现)
func swap(x *int, y *int) { var temp int temp = *x /* 保存 x 地址上的值 */ *x = *y /* 将 y 值赋给 x */ *y = temp /* 将 temp 值赋给 y */ }
-
-
函数的重载(不支持)
-
不允许相同的函数名,会报错,但是Python就不会报错(忽略上一个)
-
函数本身也是一种数据类型,,可以赋值给一个变量,该变量就是函数类型的变量,通过该变量实现对函数类型的调用
-
函数也可以作为实参传递
-
自定义数据类型
type myint int-
类似于Integer和int,不认为int和myInt是相同类型,此时需要显示转换
-
Integer和int的比较
- 两个new的Integer“==”为false
- 一个new,一个非new,“==”false
- 一个Integer,一个int。“==”true
-
-
支持返回值命名,不仅省略了return,也不需要考虑顺序
-
支持可变参数args,使用下标访问
func sum(n1 int,args... int)int{ sum := n1 //遍历args for i:= 0;i<len(args);i++{ sum += args[i] } return sum }
-
-
init函数
- 全局变量→init初始化→main
- 先外包的全局和init,再当前包的全局和init
-
Python中的函数
def 函数名(): 代码- 不存在重载,但不报错,只会忽略
- 全局变量global
- 函数的多个返回值可以用元组接收也可以用多个变量(以逗号分割)接收