Skip to content

函数和方法相关题目 #46

Open
@JasonJe

Description

@JasonJe
  1. 这段代码有什么缺陷
func funcMui(x,y int)(sum int,error){
    return x+y,nil
}

结果:第二个返回值没有命名。

解析:

  • 如果函数存在多个返回值,只要一个返回值存在命名,则另一个其他的返回值也必须命名;

  • 如果有多个返回值,必须加上括号;如果只有一个带有命名的返回值,也必须带上括号。

  1. init() 函数有几个需要注意的地方:
  • init() 函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等;

  • 一个包可以出现多个 init() 函数,一个源文件也可以包含多个 init() 函数;

  • 同一个包中多个 init() 函数的执行顺序没有明确定义,但是不同包的init函数是根据包导入的依赖关系决定的;;

  • init() 函数在代码中不能被显示调用、不能被引用(赋值给函数变量),否则出现编译错误;

  • 一个包被引用多次,如 A import B,C import B,A import CB 被引用多次,但 B 包只会初始化一次;

  • 引入包,不可出现死循环。即 A import B,B import A,这种情况编译失败。

  1. cap()函数适用于array, slice, channel类型。

  2. 可变函数的定义与调用方式

func add(args ...int) int {

    sum := 0
    for _, arg := range args {
        sum += arg
    }
    return sum
}
  • 定义:func f(elems ...Type)

  • 调用:f(a, b, c);f([]Type{a, b, c}...)

  1. 下面代码输出什么
func main() {
    var fn1 = func() {}
    var fn2 = func() {}

    if fn1 != fn2 {
        println("fn1 not equal fn2")
    }
}

解析:编译错误,函数只能与 nil 比较。

  1. 下面的代码输出什么
type N int

func (n N) test(){
    fmt.Println(n)
}

func main()  {
    var n N = 10
    fmt.Println(n)

    n++
    f1 := N.test
    f1(n)

    n++
    f2 := (*N).test
    f2(&n)
}

输出:10 11 12

解析:通过类型引用的方法表达式会被还原成普通函数样式,接收者是第一个参数,调用时显示传参。类型可以是 T*T,只要目标方法存在于该类型的方法集中就可以。

还可以直接使用方法表达式调用:

func main()  {
    var n N = 10

    fmt.Println(n)

    n++
    N.test(n)

    n++
    (*N).test(&n)
}
  1. 下面代码输出什么
type N int

func (n N) test(){
    fmt.Println(n)
}

func main()  {
    var n N = 10
    p := &n

    n++
    f1 := n.test

    n++
    f2 := p.test

    n++
    fmt.Println(n)

    f1()
    f2()
}

输出:13 11 12

解析:基于实例或指针引用的 method value,参数签名不会改变,依旧按正常方式调用。但当 method value 被赋值给变量或作为参数传递时,会立即计算并赋值该方法执行所需的 receiver 对象与其绑定,以便在稍后执行,能隐式传入 receiver 参数。

Metadata

Metadata

Assignees

No one assigned

    Labels

    GoGolang

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions