常量如何在Go中起作用?

tom*_*ing 2 go

在Go中,哪个片段分配的对象较少?或者他们都使用相同数量的分配,如果是这样的话; 为什么?(:

for i := 0; i < 10000000; i++ {
        log.println("hello")
    }
Run Code Online (Sandbox Code Playgroud)

下面的代码只分配1个字符串吗?

const (
    HELLO string = "hello"
)

for i := 0; i < 10000000; i++ {
    log.println(HELLO)
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*kin 5

这是您的程序的改编,在两种情况下都打印出基础字符串表示.

package main

import (
    "fmt"
    "reflect"
    "unsafe"
)

const (
    Hello string = "hello"
)

func main() {
    for i := 0; i < 3; i++ {
        a := "hello"
        sh := (*reflect.StringHeader)(unsafe.Pointer(&a))
        fmt.Println(a, " ", *sh)
    }

    fmt.Println()

    for i := 0; i < 3; i++ {
        a := Hello
        sh := (*reflect.StringHeader)(unsafe.Pointer(&a))
        fmt.Println(a, " ", *sh)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

hello   {4870353 5}
hello   {4870353 5}
hello   {4870353 5}

hello   {4870353 5}
hello   {4870353 5}
hello   {4870353 5}
Run Code Online (Sandbox Code Playgroud)

{}输出中的字符串头显示指向字符数据("hello")的指针,以及字符串的长度.

您可以看到整个程序中指向字符串数据的指针是相同的:字节数据"hello"仅在一个内存地址(此处为4870353)处引用,无论循环计数如何,无论是硬编码字符串还是一个常数.

语言规范本身并不保证这种行为,但是常量字符串实习是一种自然的优化,如果以任何明显不同的方式表现,它将是令人惊讶的.