不定参数
Go 支持不定参数。不定参数是指最后一个参数可以传入任意多个值。
注意必须是最后一个参数才可以声明为不定参数。
不定参数在方法内部可以被当成切片来使用
Option 模式大量应用了不定参数。
//一个人可能有很多个别名,也可能一个都没有
func YourName(Name string,alias ...string){
if len(alias)>0 {
println(alias[0])
}
}
闭包
闭包(closure),方法+它绑定的运行上下文
func Closure(name string) func() string{
//返回的这个函数,就是一个闭包。
//它引用到了 Closure 这个方法的入参
return func()string {
return "hello,"+ name
}
}
闭包如果使用不当可能会引起内存泄露的问题。即一个对象被闭包引用的话,它是不会被垃圾回收的。(面试常问)
延迟调用
defer,允许在方法返回的前一刻,执行一段逻辑。
defer类似于栈,也就是后进先出。也就是,先定义的后执行;后定义的先执行。
闭包与延迟调用
func DeferClosure() {
i := 0
defer func() {
println(i)
}()
i = 1
}
// 输出1
func DeferClosure1() {
i := 0
defer func(val int) {
println(val)
}(i)
i = 1
}
// 输出0
作为参数传入的:定义 defer 的时候就确定了。
作为闭包引入的:执行 defer 对应的方法的时候才确定。
func DeferReturn() int {
a := 0
defer func() {
a = 1
}()
return a
}
// println(DeferReturn())
// 0
func DeferReturnV1() (a int) {
defer func() {
a = 1
}()
return a
}
// println(DeferReturnV1())
// 1
type MyStruct struct {
name string
}
func DeferReturnV2() *MyStruct {
a := &MyStruct{
name: "Jerry",
}
defer func() {
a.name = "Tom"
}()
return a
}
//println(DeferReturnV2().name)
//Tom
练习题:
func DeferReturn() {
for i := 0; i < 10; i++ {
defer func() {
print(i)
}()
}
println()
}
func DeferReturnV1() {
for i := 0; i < 10; i++ {
defer func(val int) {
print(val)
}(i)
}
println()
}
func DeferReturnV2() {
for i := 0; i < 10; i++ {
j := i
defer func() {
print(j)
}()
}
println()
}
答案
10101010101010101010
9876543210
9876543210