十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
func 函数名(形参列表) (返回值类型列表) {
执行语句......
return 返回值列表
}
函数的说明形参列表:表示函数的输入
创新互联公司长期为成百上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为天涯企业提供专业的成都网站设计、网站建设,天涯网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。函数中的执行语句:表示为了实现某一功能的代码块
return:函数的返回值。函数可以有返回值,也可以没有。Go语言函数支持多个返回值,这一点是其他语言没有的:(1)如果返回多个值时,在接收时,希望忽略某个返回值,则使用 _ 符号表示占位忽略(2)如果返回值只有一个,(返回值类型) 可以不写 ()
函数的形参列表可以是多个,返回值列表也可以是多个
形参列表和返回值列表的数据类型可以是值类型和引用类型
函数的命名遵循标识符的命名规范,首字母不能是数字,首字母大写该函数可以被本包文件和其他包文件使用,首字母小写,只能被本包文件使用,其它包文件不能使用。
函数中的变量是局部的,函数外不生效
基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值
如果希望函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量
在Go中,函数也是一种数据类型 ,可以赋值给一个变量,则该变量是一个函数类型的变量了。通过该变量可以对函数调用。
函数既然是一种数据类型,因此在Go中函数可以作为形参,并调用
为了简化数据类型定义,Go支持自定义数据类型
基本语法:type 自定义数据类型名 数据类型 //理解:相当于一个别名
示例:type myInt int //这时myInt就等价int来使用了
示例:type mySum func (int,int) int //这时mySum就等价于一个函数类型func (int,int) int
支持对函数返回值命名,这个时候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元起,快前往官网查看详情吧