Go 函数

函数基础

package main

import "fmt"

//给类型命别名
type MyFunc func(a,b int)(int,string)

type Myint  int

//函数
func main() {

    var a int =10
    var b Myint=9
    fmt.Println(a+int(b))


    //定义方式
    /*
        func 名字(参数名 类型,参数名 类型)(返回值类型,返回值类型){
            函数体内容
            return 返回值1,返回值2
        }
    */
    //1 调用函数
    //add(2,3,"xxx")
    //var a int =add(2,3)
    //a := add(2, 3)
    //fmt.Println(a)
    //多返回值就需要用多变量接收
    //a,b:=add(3,4)
    //fmt.Println(a,b)
    //多返回值,忽略一个返回值
    //a,_:=add(3,4)
    //fmt.Println(a)
    //fmt.Println(_)


    //匿名函数(定义在函数内部的函数,不能是有名函数),头等函数
    //var a func()
    //a = func (){
    //    fmt.Println("我是匿名函数")
    //}
    //a()
    //函数返回值是函数
    //a:=test()
    //fmt.Println(a)  // 函数内存地址
    //a()
    //8 函数返回值为函数,返回的函数带参数
    //a:=test()
    //a("xxx")

    //9 函数返回值为函数,返回的函数带参数,带返回值
    //var a func(a,b int)int
    //a=test()
    //fmt.Println(a(2,3))

    //10 函数参数为函数类型,返回值为带参数,带返回值的函数类型
    //a,b:=test(func() {
    //    fmt.Println("我是函数参数")
    //})(3,4)
    //f:= func() {
    //    fmt.Println("我是函数参数")
    //}
    //
    //f1:=test(f)
    //a,b:=f1(3,4)
    //fmt.Println(a,b)

    //闭包函数的使用
    //a:=test(19)
    ////a是闭包函数
    //a()

    //装饰器是闭包函数的典型应用(go中没有装饰器的语法糖),通过闭包实现装饰器

    //类型重命名
    //var a MyFunc =test()
    //c,d:=a(1,2)
    //fmt.Println(c,d)


}

//1 有参数无返回值(定义函数)
//func add(a int,b int)  {
//    fmt.Println(a+b)
//}

//2 有参数无返回值,有多个相同类型参数
//func add(a ,b int)  {
//    fmt.Println(a+b)
//}
//3 有参数无返回值,有多个相同类型参数,也有不同类型
//func add(a ,b int,msg string)  {
//    fmt.Println(a+b)
//    fmt.Print(msg)
//}

//4 多个参数,一个返回值
//func add(a, b int) int {
//    return a + b
//}


//4 多个参数,多个返回值
//func add(a, b int) (int,int) {
//    return a + b,a*b
//}

//5 命名返回值
//func add(a, b int) (c int,d int) {
//    c=a+b
//    d=a*b
//    //return时,不需要再写c,d了
//    return
//}


//6  函数是一等公民,函数可以赋值给变量

//7 函数返回值为函数
//func test() func() {
//    return func() {
//        fmt.Println("我是返回函数")
//    }
//}

//8 函数返回值为函数,返回的函数带参数
// 类型只要有不一样的地方,就不是一个类型
//func test() func(msg string) {
//    return func(msg string) {
//        fmt.Println(msg)
//    }
//}

//9 函数返回值为函数,返回的函数带参数,带返回值
//func test() func(a,b int) int{
//    return func(a,b int) int {
//        return a+b
//    }
//}

//10 函数参数为函数类型,返回值为带参数,带返回值的函数类型
//func test(f func()) func(a,b int) (int,int){
//    return func(a,b int) (int,int) {
//        f()
//        return a+b,a*b
//    }
//}

//11 闭包函数:1 定义在函数内部  2对外部作用域有引用
// 闭包函数就是多了一种函数传参的方法,包进去了
//func test(age int) func()  {
//    a:= func() {
//        fmt.Println(age)
//    }
//    return a
//}

//12
func test()MyFunc  {
    return func(a,b int)(int,string) {
        fmt.Println("xxx")
        return 10,"ok"
    }

}

 函数高级

package main

import "fmt"

//函数高级(都是按位置传,没有关键字一说)

func main() {
    //test(1,2,5,6,7,8,8)

    //res:=find(10,1,2,43,54,6,7,8,9,10)
    //fmt.Println(res)


    //3 匿名函数 ,定义在函数内部
    //定义一个匿名函数,加括号使用匿名函数
    //func (){
    //    fmt.Println("我是匿名函数")
    //}()
    //把函数赋值给一个变量,并且执行
    //var a func()  //函数类型
    //a = func() {
    //    fmt.Println("aaaaa")
    //}
    //a()
    ////a是什么类型?定义出a来



    //var a func()=test(10)
    //a()
    //fmt.Println(a)
    var f func(c int)int
    f=test(10,20)
    res:=f(30)
    fmt.Println(res)

}


//1 可变长参数(可以传任意长度的int类型)
//func test(a... int)  {
//    fmt.Println(a)  //切片类型
//    fmt.Println(a[0])
//}

//2 案例:输入一个数字,和一堆数字,判断第一个数字在不在后面一堆中

//func find(a int,b ...int) string {
//    for i:=0;i<len(b);i++ {
//        if a==b[i]{
//            return ""
//        }
//    }
//    return "不在"
//}


// 3 匿名函数(没有名字的函数)


// 4 闭包函数(定义在函数内部,对外部作用域有引用)
// 函数可以赋值给一个变量:函数是一等公民,头等函数
//func test(c int) func() {
//    a:=func (){
//        fmt.Println(c)
//    }
//    return a
//}


//5 更高级的使用
//func test(a func(func()),b func())(func(a,b int),func())  {
//    return func(a, b int) {
//
//    }, func() {
//
//        }
//}


//函数的参数和返回值都是类型的一部分
//func()
//func(a int)
//func(a int)int
func test(a,b int)func(c int)int{
    f:= func(c int) int{
        return a+b
    }
    return f
}

可变参数函数

//package main
//
//import "fmt"
//
////可变长参数
//
//func main() {
//    //test1(1,2,3,4)
//
//    //给可变长参数传入切片
//    var a []int=[]int{3,4,5}
//    //var a =[]string{} //错误的
//    test1(a...) //打散了传过去
//
//}
//
//func test1(a ...int)  {
//    fmt.Println(a)
//    fmt.Println(len(a))
//    fmt.Println(cap(a))
//    fmt.Printf("%T",a)
//
//
//}


package main

import (
"fmt"
)



func main() {
    welcome := []string{"hello", "world"}
    change(welcome...)  //底层是直接把切片传入了
    fmt.Println(welcome)
}

func change(welcome ...string) {
    welcome[0] = "Go"
    fmt.Println(welcome)
}
原文地址:https://www.cnblogs.com/ZhZhang12138/p/14886665.html