第一天
包 package
- 包名(name)与文件夹名可以不相同,但是尽量把持相同
- 同一个文件夹下的文件只能有一个包名,否则编译报错
- main函数只能在main包下,否则报错:‘go run: cannot run non-main package‘
变量
-
三种声明方式:
- var v_name v_type,var v_name v_type = value.
- var v_name;
- v_name :=
-
默认值:
数值类型(包括complex64/128)为 0
-
布尔类型为 false
-
字符串为 “”(空字符串)
-
以下几种类型为 nil:
*int
- []int
- map[string] int
- chan int
- func(string) int
- error // error 是接口
-
注意:
- := 赋值语句只能在函数(方法)体中使用
- 函数(方法)体中定义的变量必须使用
-
提示:
- 交换值: a,b = b,a
- 多变量复制: a,b,c = 1,true,“string”
- 空白标识符\”_\”也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。
空标识符_使用:
package mainimport \"fmt\"func main() {_,numb,strs := numbers() //只获取函数返回值的后两个fmt.Println(numb,strs)}//一个可以返回多个值的函数func numbers()(int,int,string){a , b , c := 1 , 2 , \"str\"return a,b,c}//输出结果:2 str
常量
-
定义方式
- 显式类型定义: const b string = “abc”
- 隐式类型定义: const b = “abc”
-
iota常量,可以认为是一个可以被编译器修改的常量(记录的是常量的个数)。代码中只能读取值
-
常量用作枚举:
const (a = iotab //没有赋值的将会使用前一个常量的赋值方式,即b=iotac)
循环
- go中没有where循环
- 无限循环:
for{}
- 只有一个循环条件的循环:
var i intfor i <= 10 {i++}
*Go语言的 for 循环同样支持 continue 和 break 来控制循环,但是它提供了一个更高级的 break,可以选择中断哪一个循环
JLoop:for j := 0; j < 5; j++ {fmt.Println(j)for i := 0; i < 10; i++ {if i > 5 {break JLoop //break 语句终止的是 JLoop 标签处的外层循环。此处的的j所在的循环}fmt.Println(i)}}
- 注意: 左花括号{必须与 for 处于同一行。
switch case语句
- go中case 与 case 之间是独立的代码块,不需要通过 break 语句跳出当前 case 代码块以避免执行到下一行,示例代码如下:
var a = \"hello\"switch a {case \"hello\":fmt.Println(1)case \"world\":fmt.Println(2)default:fmt.Println(0)}
- 一分支多值
var a = \"mum\"switch a {case \"mum\", \"daddy\":mt.Println(\"family\")}
- 分支表达式
var r int = 11switch {case r > 10 && r < 20:fmt.Println(r)}
- 跨越 case 的 fallthrough
var s = \"hello\"switch {case s == \"hello\":fmt.Println(\"hello\")fallthroughcase s != \"world\":fmt.Println(\"world\")}
函数
func function_name( [parameter list] ) [return_types list] {函数体}
-
函数可以有多个返回值,都需要在返回值类型中声明类型
-
传递值,不会改变源字符串的值
package mainimport \"fmt\"func main() {str := \"abc\"reverse(str)fmt.Println(str)}func reverse(str string){str = \"cba\"}//输出: abc
- 传递引用,会改变源字符串的值
package mainimport \"fmt\"func main() {str := \"abc\"reverse(&str)fmt.Println(str)}func reverse(str *string){*str = \"cba\"}//输出: cba
- 闭包
package mainimport \"fmt\"func main() {fmt.Println(a()())}func a() func() string {str := \"ahah\"b := func() string {return str}return b}输出:ahah