Go语言基础【函数】

函数

定义一个函数

func 函数名(形参列表)(返回列表){
    
    函数体}

函数有以下几种定义方式:

  • 第一种:
func 函数名字(){
    
    
...
}
  • 第二种:
func 函数名字() 返回值{
    
    
...
return 返回值
}
  • 第三种
func 函数名字(参数列表){
    
    
...
}
  • 第四种
func 函数名字(参数列表)返回值{
    
    
...
return 返回值
}

传递数组

数组是按值传递的,当调用一个函数时,每个传入的参数都会先创建一个副本,再赋值给对应的函数变量,所以函数接收的是一个副本,而不是原始参数。

func show(value [2]string){
    
    
   value[1] = "345"
   fmt.Println(value)
}

func main() {
    
    
   value := [2]string{
    
    "123","234"}
   show(value)
   fmt.Println(value)
}

截屏2022-05-10 19.13.10.png

但是使用数组指针可以改变原函数的值

func show(value* [2]string){
    
    
   value[1] = "345"
   fmt.Println(value)
}

func main() {
    
    
   value := [2]string{
    
    "123","234"}
   show(&value)
   fmt.Println(value)
}

截屏2022-05-10 19.14.34.png

传递切片

切片是传地址的一种

func show(value []string){
    
    
   value[1] = "345"
   fmt.Println(value)
}

func main() {
    
    
   value := []string{
    
    "123","234"}
   show(value)
   fmt.Println(value)
}

截屏2022-05-10 19.16.45.png

返回值

返回简单值

在函数中,可以使用return语句将值返回到调用函数的代码行。通过返回值我们可以把程序中的大部分繁重工作转移到函数中,从而优化程序结构.

func show(T1 string , T2 string) string{
    
    
    return "good" + T1 + "nice" + T2
}

func main(){
    
    
    T := show("123" , "456")
    fmt.Println(T)
返回字典
func show(value string , ne2 int) map[string] int{
    
    
   m := make(map[string] int)  //创建一个字典
   m[value] = ne2  //利用形参赋值
   return m  //返回字典
}

func main() {
    
    
   value := show("123" , 234)
   fmt.Println(value)
}

截屏2022-05-10 19.31.59.png

返回多个值

Go语言可以让一个函数返回不止一个结果。大多数函数的返回值是两个,一个是要返回的值,另一个是错误值,或者是表示是否正确的布尔值。

func main() {
    
    
   var m map[string] int = map[string]int{
    
    "456":23}
   v , Ok := m["123"]
   if !Ok{
    
    
      fmt.Println("NO")
   }else{
    
    
      fmt.Println(v)
   }
}

截屏2022-05-10 19.40.57.png

函数变量

函数变量也有类型,既可以把函数变量赋给变量,也可以传递函数变量,或者从其他函数返回函数变量。
可以像使用普通变量一样使用函数变量,还可以把函数变量当作参数进行传递。

type Hi func(num string)string

func Hello(num string) string{
    
    
   return num + "animals"
}

func Helloow(num string) string{
    
    
   return num + "food"
}

func main(){
    
    
   var hw Hi
   hw = Hello  //将函数Hello赋值给hw,hw就像是变量就收了Hello
   words := hw("3")
   fmt.Printf("%s\n" , words)

   hw = Helloow
   words = hw("5")
   fmt.Printf(words)
}

函数的签名和函数声明的区别是,参数列表的左边不是函数名称,而是func关键字

匿名函数

type Hi func(num string) string

func Good(num string , hi Hi){
    
    
   res := hi(num)
   fmt.Println(res)
}

func main(){
    
    
   tar := "123"

   if tar == "123"{
    
    
      Good("3" , func(num string) string{
    
    
         return num + "animals"
      })
   }else{
    
    
      Good("3" , func(num string) string{
    
    
         return num + "food"
      })
   }
}

匿名函数在Go语言中较为常见,这种方式定义的函数能够获取整个语法环境,里层的函数可以使用外层函数中的变量。

变长函数

变长函数是指变量的参数个数是不确定的,在参数列表的类型名称之前使用省略号“…type”可声明一个变长函数。
“…type”是一个语法糖,可以把它看作type类型的数组切片,即[]type。

func Total(prices ...int)int{
    
    
   res := 0
   for _,val := range prices{
    
    
      res += val
   }
   return res
}

func main(){
    
    
   fmt.Println(Total(1 , 2 , 3 ,3 ,4))
   Total(11 , 22)
   fmt.Println(Total(11 , 22))

}

“…int”参数很像切片,但是变长函数的类型和一个带有普遍切片参数的类型是不同的。

func Total(prices ...int)int{
    
    
   fmt.Printf("%T\n",Total)
   return 0
}

func Total1(peices []int)int{
    
    
   fmt.Printf("%T",Total1)
   return 0
}

func main(){
    
    
   Total(12 , 11)
   Total1([]int{
    
    12})

}

截屏2022-05-10 20.06.18.png

延迟函数调用

func g(i int){
    
    
	fmt.Println("i:", i)
}

func f(){
    
    
	i := 100
	defer g(i)
	fmt.Println("i1:", i)
	i = 200
	fmt.Println("i2:", i)
	return
}

func main() {
    
    
	f()
}
//输出结果
i1 i: 100
i2 i: 200
i i: 100

猜你喜欢

转载自blog.csdn.net/weixin_60154963/article/details/124698035