前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Golang】快速复习指南QuickReview(四)——函数

【Golang】快速复习指南QuickReview(四)——函数

作者头像
DDGarfield
发布2022-06-23 18:13:28
1620
发布2022-06-23 18:13:28
举报
文章被收录于专栏:加菲的博客加菲的博客

函数

C#中的函数

1.可变参数params

代码语言:javascript
复制
static int IntSum(int x, int y)
{
    return x + y;
}

//重载,可变参数
static int IntSum(params int[] x)
{
    int sum = 0;
    for (int i = 0; i < x.Length; i++)
    {
        sum += x[i];
    }
    return sum;
}

2.返回多个值

2.1 参数out
代码语言:javascript
复制
static void Calc(int x, int y, out int sum, out int sub)
{
    sum = x + y;
    sub = x - y;
}
2.2 Tuple-元组
代码语言:javascript
复制
//元组
// static (int, int) Calc(int x, int y)
static (int sum, int sub) Calc(int x, int y)
{
    return (x + y, x - y);
}

3.delegate委托(函数类型)

C#中的函数类型就是委托

代码语言:javascript
复制
public delegate (int, int) CalculationHandler(int x, int y);

//使用
static void TestDelegate(CalculationHandler handler)
{

}

//匿名函数 有delegate关键字,没有函数签名
TestDelegate(delegate (int x, int y)
             {
                 return (x + y, x - y);
             });

//调用传值,lambda表达式,把delegate直接省略
TestDelegate((x, y) =>
             {
                 return (x + y, x - y);
             });

Golang中的函数

Golang的返回值在函数名及参数之后,函数必须写注释,且以函数名开头,否则golint会有绿色的提示

1.可变参数...

代码语言:javascript
复制
// IntSum 写注释哟
func IntSum(x int, y int) int {
    return x + y
}

// go是不支持函数重载的,所以同一个包里面的函数签名都不一致
func Sum(x ...int) int {
 //此时x是一个数组
 sum := 0
 for _, v := range x {
  sum = sum + v
 }
 return sum
}

2.返回多个值

多看几个形式,不为别的,只为能看懂别人的源码

代码语言:javascript
复制
func Calc(x int, y int) (sum int,sub int) {
 sum = x + y
 sub = x - y
 return sum, sub
}
代码语言:javascript
复制
func Calc(x int, y int) ( int, int) {
    sum := x + y
    sub := x - y
 return sum, sub
}
代码语言:javascript
复制
func Calc(x, y int) (int, int) {
 sum := x + y
 sub := x - y
 return sum, sub
}

3.函数类型

函数作为一种类型,C#创造了委托,看起来更优雅,而Golang的定义则更直接:

代码语言:javascript
复制
type calculation func(int, int) (int, int)
3.1 使用
代码语言:javascript
复制
func main() {
    var calc calculation
    calc = addOrSub
    sum, sub := calc(5, 6)
 fmt.Printf("result:sum-%v sub-%v \n", sum, sub)
    sum1, sub2 := testFuncType(8, 6, addOrSub)
    fmt.Printf("result:sum-%v sub-%v \n", sum1, sub2)
}
type calculation func(int, int) (int, int)

func addOrSub(x, y int) (int, int) {
 return x + y, x - y
}

// testFuncType 这个就比较像委托Action Func<>的使用
func testFuncType(x, y int, op calculation) (int, int) {
 return op(x, y)
}
3.2 匿名函数

Golang的匿名函数不像C#那样,需要delegate,它是没有任何关键字,使用也是简单粗暴的:

代码语言:javascript
复制
addOrSubTest := func(x, y int) (int, int) {
    return x + y, x - y
}
sum3, sub3 := addOrSubTest(9, 6)
fmt.Printf("anonymous function:sum-%v sub-%v \n", sum3, sub3)

4.返回值为函数

既然函数是一种类型,那么也可作为函数的返回值:

代码语言:javascript
复制
func do(s string) func(int, int) int {
 switch s {
 case "+":
  return func(x int, y int) int {
   return x + y
  }
 case "-":
  return func(x int, y int) int {
   return x - y
  }
 default:
  return nil
 }
}

5.新内容 defer

defer语句会将其后面跟随的语句进行延迟处理。函数即将return,将延迟处理的语句按defer定义的逆序进行执行,也就是说,先定义defer的语句最后被执行,最后定义的defer的语句,最先执行。像栈一样,先进后出,后进先出。

代码语言:javascript
复制
func main() {
    var calc calculation
    calc = addOrSub
    sum, sub := calc(5, 6)
 fmt.Printf("result:sum-%v sub-%v \n", sum, sub)
}
type calculation func(int, int) (int, int)
func addOrSub(x, y int) (int, int) {
 defer fmt.Println("addOrSub1")
 defer fmt.Println("addOrSub2")
 defer fmt.Println("addOrSub3")
 fmt.Printf("result:%v and %v\n", x+y, x-y)
 return x + y, x - y
}
代码语言:javascript
复制
result:11 and -1
addOrSub3
addOrSub2
addOrSub1
result:sum-11 sub--1

更复杂(坑爹)的defer示例,请参阅一些面试题。

再次强调:这个系列并不是教程,如果想系统的学习,博主可推荐学习资源。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 加菲的博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数
    • C#中的函数
      • 1.可变参数params
      • 2.返回多个值
      • 3.delegate委托(函数类型)
    • Golang中的函数
      • 1.可变参数...
      • 2.返回多个值
      • 3.函数类型
      • 4.返回值为函数
      • 5.新内容 defer
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档