天天看点

go interface转int_Go学习每日一问(16)-不定参数类型日省吾身答疑解惑拓展阅读任意类型的不定参数下期提问

每次学习并整理一个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}…)

思考后看下方答案…

go interface转int_Go学习每日一问(16)-不定参数类型日省吾身答疑解惑拓展阅读任意类型的不定参数下期提问

答疑解惑

参考答案:

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语言的惯例用法,且它仍然是类型安全的;

下期提问

  1. 判断下面代码能否正常执行?如果可以,写出输出结果?
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爱月”。