Description
- 这段代码有什么缺陷
func funcMui(x,y int)(sum int,error){
return x+y,nil
}
结果:第二个返回值没有命名。
解析:
-
如果函数存在多个返回值,只要一个返回值存在命名,则另一个其他的返回值也必须命名;
-
如果有多个返回值,必须加上括号;如果只有一个带有命名的返回值,也必须带上括号。
init()
函数有几个需要注意的地方:
-
init()
函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等; -
一个包可以出现多个
init()
函数,一个源文件也可以包含多个init()
函数; -
同一个包中多个
init()
函数的执行顺序没有明确定义,但是不同包的init
函数是根据包导入的依赖关系决定的;; -
init()
函数在代码中不能被显示调用、不能被引用(赋值给函数变量),否则出现编译错误; -
一个包被引用多次,如
A import B,C import B,A import C
,B
被引用多次,但B
包只会初始化一次; -
引入包,不可出现死循环。即
A import B,B import A
,这种情况编译失败。
-
cap()
函数适用于array, slice, channel
类型。 -
可变函数的定义与调用方式
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}...)
- 下面代码输出什么
func main() {
var fn1 = func() {}
var fn2 = func() {}
if fn1 != fn2 {
println("fn1 not equal fn2")
}
}
解析:编译错误,函数只能与 nil
比较。
- 下面的代码输出什么
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)
}
- 下面代码输出什么
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
参数。