函数、包、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. 导包的其他几种方式:

  1. import . "github.com/astaxie/beego"  类似于python中form xx import *
  2.  import _ "github.com/go-sql-driver/mysql"  触发init的执行,但是不使用包内的函数
  3. 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
    }
}

 

posted @ 2020-04-21 22:47  Mr沈  阅读(242)  评论(0编辑  收藏  举报