每次学习并整理一个Golang的知识点,每天进步一点点。今天学习下go中的一个知识点:不定参数类型
日省吾身
1.下面代码的输出结果?()
func increment(p *int) int {*p++return *p}func main() {n := 1increment(&n)fmt.Println(n)}
- A. 1
- B. 2
- C. 3
2.对add()函数调用正确的是?()
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}…)
思考后看下方答案…
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yMkF2N4EzNkVDOmVzMxImZlhjYwY2YwYjMldTM5EGMm9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
答疑解惑
参考答案:
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的语法糖,开发者不得不这么写:
func add(args []int) int { sum := 0 for _, arg := range args { sum += arg } return sum}
从函数的实现角度来看,这么写没有任何问题。但从调用方来说,只能这么调用:
add([]int{1, 2, 3})
我们不得不加上[]int{}这一步,来构造一个切片实例;有了...type的语法糖,我们就可以直接省略这一步了。
任意类型的不定参数
上面的例子中,将不定参数的类型限定为int类型;如果你想传递任意类型的参数,可以使用interface{};下面是go语言标准库中fmt.Printf()函数的实现:
func Printf(format string, a ...interface{}) (n int, err error) {return Fprintf(os.Stdout, format, a...)}
使用interface{}传递任意类型数据是Go语言的惯例用法,且它仍然是类型安全的;
下期提问
- 判断下面代码能否正常执行?如果可以,写出输出结果?
package mainimport "fmt"// W 结构体Wtype W struct {n int}func (x W) showD() int {result := x.n + 10return result}func (x W) showB() int {result := x.n + 20return result}// D 接口Dtype D interface {showD() int}// B 接口Btype B interface {showB() int}func main() {w := W{3}var dog D = wvar boy B = wfmt.Println(dog.showD())fmt.Println(boy.showB())}
答案及解析将在下期文章中给出,欢迎大家在评论区写出你的答案;独乐乐不如众乐乐,交流学习,互相进步。
欢迎转发和评论。更多优质原创文章,欢迎关注本头条号或微信公众号“IYue爱月”。