Go_函数

函数 : 实现某些功能的代码的封装

Go函数声明

// 基本格式
func 函数名(变量 类型, ...) 返回值类型{
    函数体
}
// 示例
func add(a int, b int) int{
    return a+b
}


// 接收多参数, 一定要在最后面, 该变量是一个数组
func 函数名(变量 ...类型) 返回值类型{
    函数体
}

// 示例
func add(num ...int) int {
	sum := 0
	for _, v := range num{
		sum += v
	}
	return sum
}

// 多返回值
func 函数名(变量 类型, ...) (返回值类型,返回值类型){
    函数体
}

// 示例 过,多返回值经常被用到

// 命名返回值, return后不必写返回的值, 只要把返回值的变量赋值就行
// 示例
func add(a ,b int)(c int){
    c = a+b
    return
}

Go函数特性

匿名函数 -- 过

func(参数列表){
   函数体
}(实参)

Go语言  函数也是一种类型(可以作为函数参数的类型), 一个函数可以赋值给变量

相同参数,返回值的函数可以认为是相同类型

import "fmt"

func def(a func(int,int)int) int{
	return a(2,1)
}
func add(a,b int)int{
	return a+b
}

func mul(a, b int)int{
	return a*b
}

func main() {
	fmt.Println(def(add))
	fmt.Println(def(mul))
}

闭包:   一个函数和与其相关的引用环境组合而成的实体; 也就是我们说的在一个函数内部访问外部的非全局变量

package main

import “fmt”

func Adder() func(int) int {
         var x int
         return func(delta int) int {
                  x += delta // 与python不同, 函数是可以访问和修改外部变量的
                  return x
         } 
}

func main() {
         var f = Adder()
         fmt.Print(f(1),” - “)
         fmt.Print(f(20),” - “)
         fmt.Print(f(300))
} 

值传递 : 函数内部使用的是实参的副本

defer语句 : 函数中定义defer语句, 在函数结束时执行, 其执行的函数实际传入的值就是defer语句定义时传入的值, 而并非函数结束时的值, 多个defer定义后进先出

package main

import "fmt"

func aa(a int){
	fmt.Println(a)
}
func main() {
	var a = 1
	defer aa(a)
	defer aa(100)
	a += 12
        fmt.Println(a)
}
// 13
// 100
// 1

defer常用来进行回收操作(比如, 关闭文件句柄)

Go特殊函数

init函数 : 每个源文件都可以包含一个init函数, 在main函数执行之前被Go框架调用

package main

import "fmt"

var a string
var b int

func main(){
    fmt.Println(a)
    fmt.Println(b)
}

func init(){
    a = "hello word"
    b = 10
}

  一个包被导入时, 其内部的init()方法也会被执行

内置函数

close:主要用来关闭channel
len:用来求长度,比如string、array、slice、map、channel
new:用来分配内存,主要用来分配值类型,比如int、struct。返回的是指针
make:用来分配内存,主要用来分配引用类型,比如chan、map、slice
append:用来追加元素到数组、slice中
panic和recover:用来做错误处理

posted @ 2018-09-08 17:40  瓜田月夜  阅读(310)  评论(0)    收藏  举报