Golang数据类型-函数(六)-创新互联

函数的定义
func 函数名(形参列表) (返回值类型列表) {
	执行语句......
	return 返回值列表	
}
函数的说明
  1. 形参列表:表示函数的输入

    创新互联公司长期为成百上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为天涯企业提供专业的成都网站设计、网站建设,天涯网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。
  2. 函数中的执行语句:表示为了实现某一功能的代码块

  3. return:函数的返回值。函数可以有返回值,也可以没有。Go语言函数支持多个返回值,这一点是其他语言没有的:(1)如果返回多个值时,在接收时,希望忽略某个返回值,则使用 _ 符号表示占位忽略(2)如果返回值只有一个,(返回值类型) 可以不写 ()

  4. 函数的形参列表可以是多个,返回值列表也可以是多个

  5. 形参列表和返回值列表的数据类型可以是值类型和引用类型

  6. 函数的命名遵循标识符的命名规范,首字母不能是数字,首字母大写该函数可以被本包文件和其他包文件使用,首字母小写,只能被本包文件使用,其它包文件不能使用。

  7. 函数中的变量是局部的,函数外不生效

  8. 基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值

  9. 如果希望函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量

  10. 在Go中,函数也是一种数据类型 ,可以赋值给一个变量,则该变量是一个函数类型的变量了。通过该变量可以对函数调用。

  11. 函数既然是一种数据类型,因此在Go中函数可以作为形参,并调用

  12. 为了简化数据类型定义,Go支持自定义数据类型
    基本语法:type 自定义数据类型名 数据类型 //理解:相当于一个别名
    示例:type myInt int //这时myInt就等价int来使用了
    示例:type mySum func (int,int) int //这时mySum就等价于一个函数类型func (int,int) int

  13. 支持对函数返回值命名,这个时候return不必指定返回哪个变量了

package main

import (
	"fmt"
)
func cal(n1 int, n2 int) (sum int, sub int) {sum = n1 + n2
	sub = n1 - n2
	return  //这个时候return不必指定返回哪个变量了
}

func main() {fmt.Println(cal(5, 4))
}

1.4 Go支持可变参数

//支持0到多个参数
func sum(args... int) (sum int) {}

支持1到多个参数
func sum(n1 int, args... int) (sum int) {}
package main

import (
	"fmt"
)

//Go可变参数示例:支持0到多个参数
func sum0(args... int) (sum int) {sum = 0
	//遍历args
	for i := 0; i< len(args); i++ {sum += args[i]
	}
	return
}

//Go可变参数示例:支持1到多个参数
func sum1(n1 int,args... int) (sum int) {sum = n1
	//遍历args
	for i := 0; i< len(args); i++ {sum += args[i]
	}
	return
}

func main() {fmt.Println(sum0())  //sum0调用可以不传入任何参数
	fmt.Println(sum1(10,-1,5,5))  //sum1调用至少传入一个参数
}
init函数

每一个源文件都可以包含一个init函数,init函数主要的做用就是完成一些初始化工作,该函数会在main函数之前执行,被Go运行框架调用,也就是说init会在main函数之前被调用。

package main
import "fmt"
func init(){fmt.Println("init print......")
}
func main(){fmt.Println("main print......")
}

如果一个文件同时包含全局变量定义、init函数和main函数,则执行流程为:全局变量定义—>init函数—>main函数

匿名函数

匿名函数使用方式1
在定义匿名函数时就直接调用,这种方式匿名函数只能调用一次。

package main

import "fmt"

func main() {res1 := func(n1 int, n2 int) int {return n1 + n2
	}(10, 20)   //这里的(10, 20)就是直接调用函数了
	fmt.Println("res1 = ", res1)
}

匿名函数使用方式2
将匿名函数赋给一个变量(函数变量),再通过该变量来调用匿名函数

package main

import "fmt"

func main() {a := func(n1 int, n2 int) int {return n1 + n2
	}
	res1 := a(10, 20) //这里通过 函数变量a 来调用匿名函数
	fmt.Println("res1 = ", res1)
}

匿名函数使用方式3:全局匿名函数
如果将匿名函数赋给一个全局变量,那么这个匿名函数,就成为一个全局匿名函数,可以再程序有效。

package main

import "fmt"

var (
	Func1 = func(n1 int, n2 int) int {return n1 + n2
	}
)

func main() {res1 := Func1(10, 20)
	fmt.Println("res1 = ", res1)
}
函数的defer

在函数种,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等),为了在函数执行完毕后,及时的释放资源,Go的设计者提供defer(延时机制)。
(1)当go执行到一个defer时,不会立即执行defer后的语句,而是将defer后的语句压入到一个栈种,然后继续执行函数的下一个语句
(2)当函数执行完毕后,再从defer栈中,依次从栈顶取出语句执行(注:遵守栈 先入后出的机制)
(3)在defer将语句放入到栈时,也会将相关的值拷贝同时入栈
在这里插入图片描述

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:Golang数据类型-函数(六)-创新互联
标题链接:http://pwwzsj.com/article/ceogie.html