每次学习并整理一个Golang的知识点,每天进步一点点。今天学习下go中的一个知识点:不定参数类型🤔

日省吾身

1.下面代码的输出结果?()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
func increment(p *int) int {
	*p++
	return *p
}

func main() {
	n := 1
	increment(&n)
	fmt.Println(n)
}
  • A. 1
  • B. 2
  • C. 3

2.对add()函数调用正确的是?()

1
2
3
4
5
6
7
8
func add(args ...int) int {

    sum := 0
    for _, arg := range args {
        sum += arg
    }
    return sum
}
  • A. add(1, 2)
  • B. add(1, 3, 7)
  • C. add([]int{1, 2})
  • D. add([]int{1, 3, 7}…)

思考后看下方答案…

思考后看答案


答疑解惑

参考答案:

1. B 知识点:指针;

  • increment() 函数里的 p 是 *int 类型的指针,*p++是将该地址的值执行一个自增操作,并返回自增后的结果;
  • main() 函数中increment(&n)调用后将变量 n 的地址的值+1,所以得到2;

2. ABD 知识点:不定参数类型;

  • 不定参数是指函数传入的参数个数为不定数量;
  • 为了做到上述要求,首先需要将函数定义为接受不定参数类型,如题干所示;
  • 题干代码的意思是:函数add(),接收不定数量的参数,且这些参数的类型均为int型;
  • 它的调用的方式为:add(x, y)add(x, y, z),所以A和B选项肯定是正确的;
  • 形如...type格式的类型,只能作为函数的参数类型存在,且必须是最后一个参数;他是一个语法糖,即这种语法对语言的功能没有影响,只是为了方便程序员使用,增加程序的可读性;
  • slice后面带三点省略号的形式,相当于把slice中包含的元素打散后传入;D选项相当于add(1, 3, 7),也是正确的;

以上,你做对了吗?😊

其他相关答案或补充知识点,欢迎在评论区留言补充!

拓展阅读

假如没有...type的语法糖,开发者不得不这么写:

1
2
3
4
5
6
7
8
func add(args []int) int {

    sum := 0
    for _, arg := range args {
        sum += arg
    }
    return sum
}

从函数的实现角度来看,这么写没有任何问题。但从调用方来说,只能这么调用:

1
add([]int{1, 2, 3})

我们不得不加上[]int{}这一步,来构造一个切片实例;有了...type的语法糖,我们就可以直接省略这一步了。

任意类型的不定参数

上面的例子中,将不定参数的类型限定为int类型;如果你想传递任意类型的参数,可以使用interface{};下面是go语言标准库中fmt.Printf()函数的实现:

1
2
3
func Printf(format string, a ...interface{}) (n int, err error) {
	return Fprintf(os.Stdout, format, a...)
}

使用interface{}传递任意类型数据是Go语言的惯例用法,且他仍然是类型安全的;

下期提问

  1. 判断下面代码能否正常执行?如果可以,写出输出结果?
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package main

import "fmt"

// W 结构体W
type W struct {
	n int
}

func (x W) showD() int {
	result := x.n + 10
	return result
}

func (x W) showB() int {
	result := x.n + 20
	return result
}

// D 接口D
type D interface {
	showD() int
}

// B 接口B
type B interface {
	showB() int
}

func main() {
	w := W{3}
	var dog D = w
	var boy B = w
	fmt.Println(dog.showD())
	fmt.Println(boy.showB())
}

答案及解析将在下期文章中给出,欢迎大家在评论区写出你的答案;独乐乐不如众乐乐,交流学习,互相进步


欢迎转发和评论。更多优质原创文章,欢迎关注微信公众号“IYue爱月”或扫描下方二维码:

xujpxm_qrcode_gh