go语言"奇葩"输出结果汇总

173 阅读1分钟

总结

  1. go是值复制语言,任何时候都是复制操作
type P struct {
    Name string
    Age  int
}

func main() {
    o := []P{
        P{"chain1", 20},
        P{"chain2", 21},
        P{"chain3", 22},
    }
    oPointer := make([]*P, 0, 3)
    for _, v := range o {
        oPointer = append(oPointer, &v)
    }
    fmt.Println(oPointer)
    for _, v := range oPointer {
        fmt.Println(v)
    }
}

结果: &P{"chain3", 22} 打印三遍,并且并不是o中的元素地址 原因: v是给定一个地址,逐个从切片里值复制出来的

package main

import "fmt"

func f() int {
	n := 0
	defer func() {
		n++
	}()
	return n
}

func g() (n int) {
	defer func() {
		n++
	}()
	return n
}

func main() {
	fmt.Printf("f() == %d\n", f())
	fmt.Printf("g() == %d\n", g())
}

结果: 0 ,1 原因: 同上,值复制的原因