golang 怎么定义可变参数的函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang 怎么定义可变参数的函数相关的知识,希望对你有一定的参考价值。

golang定义可变参数的函数方法是:

  —- 采用ANSI标准形式时,参数个数可变的函数的原型声明是:
  type funcname(type para1, type para2, …)
—- 这种形式至少需要一个普通的形式参数,后面的省略号不表示省略,而是函数原型的一部分。type是函数返回值和形式参数的类型。

—- 采用与UNIX System V兼容的声明方式时,参数个数可变的函数原型是:
  type funcname(va_alist)
va_dcl
  —- 这种形式不需要提供任何普通的形式参数。

type是函数返回值的类型。va_dcl是对函数原型声明中参数va_alist的详细声明,实际是一个宏定义,对不同的硬件平台采用不同的类型来定义,但在最后都包括了一个分号。因此va_dcl后不再需要加上分号了。va_dcl在代码中必须原样给出。va_alist在VC中可以原样给出,也可以略去。

此外,采用头文件stdarg.h编写的程序是符合ANSI标准的,可以在各种操作系统和硬件上运行;而采用头文件varargs.h的方式仅仅是为了与以前的程序兼容。所以建议使用前者。
参考技术A golang 怎么定义可变参数的函数
选择设定请求的时间,让它成为异步请求,同时在执行完毕后提供 callback。

call.enqueue(new Callback<List<Contributor>>()
@Override
public void onResponse(Response<List<Contributor>> response, Retrofit retrofit)
// handle success


@Override
public void onFailure(Throwable t)
// handle failure

);

听起来超简单!我们来处理一下 UI,然后写入代码。在浮动按钮的应用模板下,我们需要修改 content_main.xml 文件。笔者添加了一个发起请求查询的按钮,以及一个用以显示请求结果的文本区域:

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fetch"
android:id="@+id/button"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="151dp" />本回答被提问者采纳

Golang快速复习指南QuickReview——函数

函数

作为增强代码的复用性性和可读性,函数必不可少。

1.C#中的函数

1.1 可变参数params

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;
}

1.2 返回多个值

参数out

static void Calc(int x, int y, out int sum, out int sub)
{
    sum = x + y;
    sub = x - y;
}

Tuple-元组

//元组
// static (int, int) Calc(int x, int y)
static (int sum, int sub) Calc(int x, int y)
{
    return (x + y, x - y);
}

1.3 delegate委托(函数类型)

C#中函数类型就是委托

public delegate (int, int) CalculationHandler(int x, int y);

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

}

//调用传值
TestDelegate((x, y) =>
             {
                 return (x + y, x - y);
             });
//匿名函数
TestDelegate(delegate (int x, int y)
             {
                 return (x + y, x - y);
             });

2.Golang中的函数

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

2.1 可变参数...

// 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.2 返回多个值

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

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

2.3 函数类型

函数做为一种类型,Golang的定义更直接:

type calculation func(int, int) (int, int)

2.3.1 使用

func main() {
    var calc calculation
    calc = addOrSub
    sum, sub := calc(5, 6)
	fmt.Printf("result:sum-%v sub-%v 
", sum, sub)
    sum1, sub2 := testFuncType(8, 6, addOrSub)
    fmt.Printf("result:sum-%v sub-%v 
", sum1, sub2)
}
type calculation func(int, int) (int, int)
func addOrSub(x, y int) (int, int) {
	return x + y, x - y
}

// testFuncType 这个就比较像委托了
func testFuncType(x, y int, op calculation) (int, int) {
	return op(x, y)
}

2.3.2 匿名函数

Golang的匿名函数没有任何关键字,也是简单粗暴的使用:

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 
", sum3, sub3)

2.4 新内容 defer

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

func main() {
    var calc calculation
    calc = addOrSub
    sum, sub := calc(5, 6)
	fmt.Printf("result:sum-%v sub-%v 
", 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
", x+y, x-y)
	return x + y, x - y
}
result:11 and -1
addOrSub3
addOrSub2
addOrSub1
result:sum-11 sub--1

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

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

以上是关于golang 怎么定义可变参数的函数的主要内容,如果未能解决你的问题,请参考以下文章

golang中可变长参数的使用

怎么将可变参数的函数的参数传递给另一个可变参数的函数

是否可以在 golang 中使用自定义库触发编译时错误?

c语言如何封装一个带有可变参数的方法?

C语言中如何实现可变参函数

c语言中啥是可变参数?最好有简单的应用可变参数的例子。谢谢