Go 基础教程--6 数组 Array

func函数

  • Go 函数 ==不支持== 嵌套、重载和默认参数
  • 但支持 无需声明原型、不定长度变参、多返回值、命名返回值参数
    匿名函数、闭包
  • 定义函数使用关键字 func,且左大括号不能另起一行
  • 函数也可以作为一种类型使用
实例1:
package main

import "fmt"

//func main() {
//  C('a',1,2)
//}
//
////不定长变参,把这种不定长变参放最后
//func C(b string ,a ...int) {
//  fmt.Println(a)
//}

//func A(a int ,b string) (int ,string, string) {
//func A(a int ,b string) int {
//func A(a int ,b string) int {
//func A(a int ,b int, c int) int){
//func A(a ,b , c int) int{
//func A() (a ,b , c int){

//func A() (int, int, int){
////如果没有命名返回值,return需要明确
//a, b, c := 1, 2, 3
//return a, b, c
////如果已经命名返回值func A() (a ,b , c int){
////直接return即可
//}

//func B() (a, b, c int) {
//  a, b, c = 1, 2, 3
//  return
//
//}
实例2:
package main
import "fmt"
func main() {
    a, b := 1, 2
    A(a,b)
    fmt.Println(a,b)
}

func A (s ...int) {
    s[0] = 3
    s[1] = 4
    fmt.Println(s)
}

//值拷贝
//[3 4]
//1 2
package main

import "fmt"

func main() {
    a := 1
    D(a)
    fmt.Println(a)
}

func D(a int) {
    a = 2
    fmt.Println(a)
}
//值拷贝
//2
//1

package main

import "fmt"

func main() {
    a := 1
    D(&a)
    fmt.Println(a)
}

func D(a *int) {
    *a = 2
    fmt.Println(*a)
}
//2
//2
实例3:
package main

import "fmt"

func main() {
    s1 := []int{1,2,3,4,5}
    C(s1)
    fmt.Println(s1)
}

func C(s []int) {
    s[0] = 5
    s[1] = 6
    s[2] = 7
    s[3] = 8
    fmt.Println(s)
}

//不是传递一个指针,而是对内存地址进行一个拷贝
//本质都是拷贝传递,但是拷贝的对象不一样,一个是值拷贝,一个是内存地址拷贝
实例4:

函数也是一种类型

package main

import "fmt"

func main() {
    a := E
    a()

}

func E(){
    fmt.Println("func E")
}
//func E
实例5:

匿名函数

package main

import "fmt"

func main() {
    a := func (){
        fmt.Println("func E")
    }
    a()

}

//func E

defer

  • 的执行方式类似其它语言中的析构函数,在函数体执行结束后
    按照调用顺序的相反顺序逐个执行
  • 即使函数发生严重错误也会执行
  • 支持匿名函数的调用
  • 常用于资源清理、文件关闭、解锁以及记录时间等操作
  • 通过与匿名函数配合可在return之后修改函数计算结果
  • 如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer
    时即已经获得了拷贝,否则则是引用某个变量的地址
  • Go 没有异常机制,但有 panic/recover 模式来处理错误
  • Panic 可以在任何地方引发,但recover只有在defer调用的函数中有效

课堂作业

运行以下程序并分析输出结果。

package main

import "fmt"

func main() {
    var fs = [4]func(){}

    for i := 0; i<4; i++ {
        defer fmt.Println("defer i = ", i)
        defer func() { fmt.Println("defer_closure i = ", i )}()
        fs[i] = func() {
            fmt.Println("closure i = ", i)
        }
    }

    for _, f := range fs {
        f()
    }
}

closure i =  4
closure i =  4
closure i =  4
closure i =  4
defer_closure i =  4
defer i =  3
defer_closure i =  4
defer i =  2
defer_closure i =  4
defer i =  1
defer_closure i =  4
defer i =  0
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!