函数、包、mode模式、if-else语句、循环、switch语句
函数、包、mode模式、if-else语句、循环、switch语句
1. 函数
func关键字 函数名(形参1 类型,形参2 类型) (返回值类型) {函数体内容}
// 1 无参数 无返回值 func test() { fmt.Println("test") } // 2 有一个参数 无返回值 func test(a int) { fmt.Println(a) } // 3 有多个参数 无返回值(没有默认参数与关键字参数) func test(a int, b string) { fmt.Println(a, b) } 如果参数类型都相同可以简写 func test(a , b int) { fmt.Println(a, b) } // 4 有多个参数 有一个返回值(需要指定返回值的类型是什么) func test(a int, b int) int{ c:=a+b return c } //或者: func test(a int, b int) (int){ c:=a+b return c } // 5 有多个参数 有多个返回值(需要指定返回值的类型是什么) //有几个返回值必须有几个参数去接收,如果某一个返回值不想要就用 _ 接收 //c, _ := test(18, 2) func test(a int, b int) (int, int){ c:=a+b d:=a*b return c,d } // 6 可变长参数(...传任意长度的int类型)test(19, 20, 100, 21,220) func test(a...int) { fmt.Println(a) // a[]是切片 fmt.Println(a[1]) } // 7 匿名函数(定义在函数内部,没有名字的函数,并且加括号使用) func test() { func (){ fmt.Println("匿名函数") }() } // 8 函数是一等公民(头等函数) // 在一门语言中,如果函数可以赋值当变量使用,那函数就叫一等公民或者头等函数 // 返回值类型是函数类型 func test() func() { return func() { fmt.Println("内层函数") } //} // 9 闭包函数 (1 定义在函数内部 2 对外层作用域有引用) func test(b int) func(){ a:= func() { fmt.Println(b) } return a } // 10 闭包函数高级 返回值是函数类型要带参数 func test(b int) func(x,y int){ a:= func(x,y int) { fmt.Println(b+x+y) } return a }
2. 包
1. 在同一个包下(文件夹下),包名必须一致
2. 包名建议都使用文件夹名
3. 同一个包下,同名函数只能有一个(init除外)init函数类似于python中的__init__.py文件在init中使用的函数,其他中都能直接使用
4. 一个包(当成一个文件),同一个包下的函数可以直接调用
5. 导包的位置从src路径开始
6. 包只要在src路径下就可以导入
7. 大写表示导出,在外部包也可以使用小写只能包内部使用
8. 使用第三方包框架:go get github.com/astaxie/beego (放在了gopath的src路径下)类似于python中的pip3 install xxx
9. 导包的其他几种方式:
- import . "github.com/astaxie/beego" 类似于python中form xx import *
- import _ "github.com/go-sql-driver/mysql" 触发init的执行,但是不使用包内的函数
- import f "fmt" 重命名,以后直接用f
package main import "github.com/astaxie/beego" func main() { beego.Run() }
3. mode 模式
- GO111MODULE=off: 不使用 modules 功能,查找vendor和GOPATH目录
- GO111MODULE=on: 使用 modules 功能,不会去 GOPATH 下面查找依赖包。
- GO111MODULE=auto: Golang 自己检测是不是使用 modules 功能,如果当前目录不在$GOPATH 并且 当前目录(或者父目录)下有go.mod文件,则使用 GO111MODULE, 否则仍旧使用 GOPATH mode
set GO111MODULE=on //windows export GO111MODULE=on //linux
在 GOPATH 之外创建一个项目 test-demo,包含一个 main.go 文件,内容如下:
package main import "fmt" import "github.com/astaxie/beego" func main() { fmt.Println("hello") beego.Run() }
在项目根目录执行命令 go mod init test-demo
,然后会生成一个 go.mod文件
使用 go run 即可触发 modules 工作。
go run test.go
一旦开启了go mod模式,代码不需要放在src路径下(任意位置都可以)
4. if-else语句
//if-else package main import "fmt" func main() { a:=9 //1 基本使用 if a>10{ fmt.Println("大于10") }else { fmt.Println("小于等于10") } //2 if -else if -else if a>10{ fmt.Println("大于10") }else if a==10 { fmt.Println("等于10") }else { fmt.Println("小于10") } //3 不能换行(go语言每一行结尾,需要加一个; ,每当换行,会自动加;) if a>10{ fmt.Println("大于10") }else if a==10 { fmt.Println("等于10") }else { fmt.Println("小于10") } //4 条件里可以进行初始化操作(有作用域范围的区别) if a:=20;a<10{ fmt.Println("xxx") }else { fmt.Println("yyyy") } fmt.Println(a) }
5. switch-case 语句
到哪一层case如果成立就停止不会再往下走了,如果都不成立用default设置默认值, fallthrough,无条件执行下一个case
//switch 到哪一层如果成立就停止不会再往下走了 package main import "fmt" func main() { // 1 switch 基本使用 a:=10 switch a { case 1: fmt.Println("1") case 2: fmt.Println(2) case 9: fmt.Println(9) case 10: fmt.Println("10") } //2 default //a:=15 switch a { case 1: fmt.Println("1") case 2: fmt.Println(2) case 9: fmt.Println(9) case 10: fmt.Println("10") default: fmt.Println("不知道") } //3 多条件 //a:=3 switch a { case 1,2,3: fmt.Println("1") case 4,5,6: fmt.Println(2) case 7,9: fmt.Println(9) case 10,16: fmt.Println("10") default: fmt.Println("不知道") } //4 无表达式 //a:=3 switch { case a==1 || a==3: fmt.Println("1") case a==4||a==5: fmt.Println(2) default: fmt.Println("不知道") } //5 fallthrough,无条件执行下一个case //a:=1 switch { case a==1 || a==3: fmt.Println("1") //fallthrough //fallthrough 会无条件执行下一个case case a==4||a==5: fmt.Println(2) fallthrough default: fmt.Println("不知道") } }
6. for循环
go中没有while
基本语法:for初始化; 条件判断; 自增/自减 {循环体内容}
//循环(只有for循环,没有while ,do while) package main func main() { //1 基本语法 //for 初始化;条件判断;自增/自减{ 循环体内容 } 三部分都可以省略 // 打印0--9 i++ => i+=1 for i:=0;i<10 ;i++ { fmt.Println(i) } //2 省略第一部分(初始化),作用域范围不一样 i:=0 for ;i<10 ; i++ { fmt.Println(i) } //3 省略第三部分 for i:=0;i<10 ; { i++ fmt.Println(i) } //4 省略第一和第三部分 i := 0 for ; i < 10; { i++ fmt.Println(i) } //5 这不就是while循环吗? //for 条件 {} i := 0 for i < 10 { i++ fmt.Println(i) } for true{ fmt.Println(1) } //6 死循环(三部分都省略) for { fmt.Println(1) } //7 break和continue for { fmt.Println(1) //break continue } }