人生人生苦短,Let's Go !!!

举报
赵KK日常技术记录 发表于 2023/06/24 11:30:47 2023/06/24
831 0 0
【摘要】 语法基础之函数跟java的方法是一样的,复杂情况还是有所区别,关键字func基本语法func 函数名(参数)(返回值){ 函数体}类型简写如果入参相邻参数类型一致,则可以省略func intSum(x, y int) int { return x + y}可指定返回参数的名称,但不可省略returnfunc calc(x, y int) (sum, sub int) { sum = ...

语法基础之函数

跟java的方法是一样的,复杂情况还是有所区别,关键字func

基本语法

func 函数名(参数)(返回值){
    函数体
}

类型简写

如果入参相邻参数类型一致,则可以省略

func intSum(x, y int) int {
  return x + y
}

可指定返回参数的名称,但不可省略return

func calc(x, y int) (sum, sub int) {
	sum = x + y
	sub = x - y
	return
}

可变参数 传进来是一个切片

func intSum2(x ...int) int {
  fmt.Println(x) //x是一个切片
  sum := 0
  for _, v := range x {
    sum = sum + v
  }
  return sum
}

函数既可以接受可变参数也可以接受固定参数,接受可变参数时放在函数的最后,固定参数当然是必须传值的,go语言中没有默认参数

返回多个参数

defer语句 最后defer的语句 最先执行

fmt.Println("a的类型是%T,getsum的类型是%T\n",a)

defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
PS D:\GoWorkSpace\project\src\main> go run .\defer.go
a的类型是%T,getsum的类型是%T
0
3
2
1

函数变量作用域 跟java的如出一辙,全局变量与局部变量遵守就近原则

外部函数不能访问内部函数即局部变量,for循环,判断变量仅在循环内等

函数作为变量

函数作为变量传值是是func类型

func main(){
  abc :=sum2
  fmt.Printf("%T\n",abc)
  abc()
}

函数作为参数

func add(x, y int) int {
  return x + y
}
func calc(x, y int, op func(int, int) int) int {
  return op(x, y)
}
//入参  x,y  返回值是func func main() {
  ret2 := calc(10, 20, add)
  fmt.Println(ret2) //30
}

定义函数类型 type

type calculation func(int, int) int

匿名函数 闭包

func  main(){

  func(){

    fmt.Println("匿名函数")
  }()

}

闭包=函数+引用环境

func  main(){
  
  r := add()
  r()//相当于执行了函数内部的匿名函数
}
//定义一个函数 返回值是一个函数
func add() func(){
  return func(){
  fmt.Println("Hello")
  }

}
func  main(){
  
  r := add()  此时是一个闭包
  r()//相当于执行了函数内部的匿名函数
}
//定义一个函数 返回值是一个函数
func add() func(){
  name :="kk"
  return func(){
  fmt.Println("Hello",name)
  }

}

r 此时是一个闭包 返回函数的内部是否有外部函数的引用

func  main(){
  
  r := add("zkk")
  r()//相当于执行了函数内部的匿名函数
}
//定义一个函数 返回值是一个函数
func add(name string) func(){
  //name :="kk"
  return func(){
  fmt.Println("Hello",name)
  }
}

内置函数介绍

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

Go语言中目前(Go1.12)是没有异常机制,但是使用panic/recover模式来处理错误。panic可以在任何地方引发,但recover只有在defer调用的函数中有效

func funcA() {
  fmt.Println("func A")
}

func funcB() {
  defer func() {
    err := recover()
    //如果程序出现了panic错误,可以通过recover恢复过来
        if err != nil {
      fmt.Println("recover in B")
    }
  }()
  panic("panic in B")
}

func funcC() {
  fmt.Println("func C")
}
func main() {
  funcA()
  funcB()
  funcC()
}

qiepoian1

请在此添加图片描述

切片不是很好理解,基于数组的基础上去理解吧,函数没什么好说的,常规的约定

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。