02 函数高级 if swith条件判断 for循环 自定义包

一 、函数高级

1.内部函数和闭包函数

package main

import "fmt"

//内层函数-匿名函数:定义在函数内部的函数,必须加括号调用
//go中函数内部定义的函数是不能有名的,需要定义匿名函数:没有名字
    func test(a int)  {
        func() {
            fmt.Println("我是内层函数")
        }()  //go贱毛病,定义了就必须调用,所以必须加()调用
    }
//闭包函数 在内部+引用外部 不需要返回 func test(a int) (){ //var c int =100 func() { fmt.Println(a) // 这里引用c,也是引用外部,也符合闭包函数 fmt.Println("我是闭包函数") }() } // 有返回值类型 func test1(a int) (func()) { b:=func() { fmt.Println(a) fmt.Println("我是闭包函数") } return b }

2.函数当作参数和返回值

// 定义一个函数,传入函数,返回函数
package main
import "fmt"

func main() {
    a:=test2
    a=test(a)
    a()
    fmt.Println(a)
}

func test(a func()) func()  {
    b:= func() {
        fmt.Println("我先执行")
        a()
        fmt.Println("函数执行完了")
    }
    return b
}
func test2()  {
    fmt.Println("xxxx")

}
/*
我先执行
xxxx
函数执行完了
0x49a920
*/

3.起别名

package main

func main() {
var a MyInt=10
fmt.Println(a)
}
//重命名
type MyFunc  func(a int,b int) func()  // 给这一大堆命名,MyFunc不再是func类型
type MyInt int

func test() (MyFunc)  {  //无论多复杂牢记  func + 参数 + 返回值类型

    c:= func(a int,b int) func(){
        return func() {
        }
    }
    return c
}

 二、条件判断

1. if  else

//if -else
package main

import "fmt"

func main() {
    a := 90
    //if  条件{}    大括号和条件之间不能换行
    if a == 90{
        fmt.Println("a 是90");
    }
    if a >90{
        fmt.Println("a 大于90")
    }else if a<90{
        fmt.Println("a 小于90")
    }else {
        fmt.Println("a 等于90")
    }

    //在条件中可以定义变量,但是它的作用于范围只在if判断内部使用
    if a :=90;a>90{
        fmt.Println("大于")
    }else if a==90{
        fmt.Println(a)

    }
    //fmt.Println(a)
}

2. swith   case

//switch语句
package main

import "fmt"

func main() {
    //基本用法  相当于 if
            a:=10
            switch a {
            case 1:
                fmt.Println("1")
            case 2:
                fmt.Println("2")
            case 10:
                fmt.Println("10")

            }

    //default  相当于if | elif | else
            a:=11
            switch a {
            case 1:
                fmt.Println("1")
            case 2:
                fmt.Println("2")
            case 10:
                fmt.Println("10")
            default:
                fmt.Println("不知道")
            }

    //多值匹配
            a:=11
            switch a {
            case 1,4,5:
                fmt.Println("1")
            case 2,8,9:
                fmt.Println("2")
            case 10,11:
                fmt.Println("10")
            default:
                fmt.Println("不知道")
        }
    //无表达式的 switch
            a:=11
            switch  {
            case a>10:
                fmt.Println("大于10")
            case a<10:
                fmt.Println("小于10")
            default:
                fmt.Println("10") 
                
    //Fallthrough  //穿透,只要遇到,无条件执行下一个case的内容
            a:=10
            switch a {
            case 1:
                fmt.Println("1")
                fmt.Println("xxxx")
            case 2:
                fmt.Println("2")
            case 10:
                fmt.Println("10")
                fallthrough
            case 11:
                fmt.Println("11")
                test5()
                fallthrough
            case 12:
                fmt.Println("12")
            }
        }

func test5()  {
    fmt.Println("xxxxxx")

}

三、for循环

//for 循环
package main

func main() {

    // 基本语法 完整版
        for i:=0;i<10;i++{
            fmt.Println(i)
        }
        //三部分,都可以省略
            //先省略第一部分
            //i :=0
            //for ;i<10;i++{
            //    fmt.Println(i)
            //}
        //省略第三部分
            //i :=0
            //for ;i<10;{
            //    i++
            //    fmt.Println(i)
            //}
        //省略第二部分
            //for ;;{
            //    fmt.Println("xxxx")
            //}
    //死循环
            //for {
            //    fmt.Println("xxxx")
            //}
    //只写条件  for 条件{}  等同于while循环
            //for {
            //    
            //    fmt.Println("sdffsdsa")
            //}
    //break和continue跟其他任何语言都一样

            //for i:=0;i<10;i++{
            //    if i==5{
            //        break
            //    }
            //    fmt.Println(i)
            //}
            //for i:=0;i<10;i++{
            //    if i==5{
            //        continue
            //    }
            //    fmt.Println(i)
            //} 
        }

四、包管理

GOPATH可修改路径,路径下有三个文件夹,没有自己建,自己的项目代码、包和第三方模块都放在src下

所有代码和第三方模块都放在GOPATH下,多项目时就会出问题,可以重新建立一个GOPATH,修改路径

 

在GOPATH下建立包pacakage,该包下建立两个文件pacakage1和pacakage2:

package mypackage  //通常情况下,包名就是文件夹名,在同一个文件夹下,包名必须一致
func test(a,b int) int{
    return a+b
}

 

package mypackage
import "fmt"
//在同一个包下,变量,函数,都不能重复定义
//在包内定义的函数如果是小写字母开头,表示只能在包内部使用,在外部包想使用,必须首字母大写,因此推荐驼峰体命名
func Test1()  {
    fmt.Println(test(1,2))
    fmt.Println("xxxx")
}

在项目中导入使用:

// 包的使用
package main

import "mypackage"
import "fmt"

func main() {
    //想使用mypackage包下的Test函数和Test1函数
    mypackage.Test1()
    fmt.Println("xxx")
}

 导入第三方的包

        -下载第三方包(大多都在github上)
            go get github.com/astaxie/beego
            beego、gin

 

 

 

 

 

posted @ 2019-12-10 19:30  www.pu  Views(157)  Comments(0)    收藏  举报