常量展开
const a = 100
func main() {
const b = 200
println(a, b)
}
$ go tool objdump -s "main\.main" test
TEXT main.main(SB)
main.go:7 CALL runtime.printlock(SB)
main.go:7 MOVQ $0x64, 0(SP)
main.go:7 CALL runtime.printint(SB)
main.go:7 CALL runtime.printsp(SB)
main.go:7 MOVQ $0xc8, 0(SP)
main.go:7 CALL runtime.printint(SB)
main.go:7 CALL runtime.printnl(SB)
main.go:7 CALL runtime.printunlock(SB)
定义常量在哪里使用就会在哪里展开。可以通过汇编来确认。
反汇编可以看到MOVQ $0x64, 0(SP)
,其实编译器会把常量展开到调用的地方,所以和println(100)
写法根本没有任何区别。
我们用常量的目的不是说导致一定的性能损失,因为常量会被展开,我们用常量目的是为了代码有更好的阅读性。一个软件最终产出除了编译出来程序以外,它的代码也是很重要的资产,代码的可阅读性可维护性同样是非常重要的。