Ссылка на строковые литералы в Go

В своем приложении я часто буду передавать ссылки на статическую строку. Я не хочу, чтобы Go выделял память для каждого вызова, но мне не удалось получить адрес для моего строкового литерала.

Почему нельзя взять адрес строкового литерала (см. test1()в примере ниже)? Я неправильно понял синтаксис или это ограничение из-за внутренней работы Go?

Если это невозможно, то какое решение было бы лучшим?

test2()работает, но будет ли он каждый раз выделять память для var hej?
test3()не будет выделять новую память, но я хочу избежать беспорядка вне функции.

package main

import "fmt"

var konnichiwa = `こんにちは世界`

// Gives the compile error `cannot take the address of "Hello world"`
func test1() (*string) { return &`Hello world` }

// Works fine
func test2() (*string) {
    hej := `Hej världen`
    return &hej
}

func test3() (*string) { return &konnichiwa }

func main(){
    fmt.Println(*test1())
    fmt.Println(*test2())
    fmt.Println(*test3())
}

Спасибо за помощь!

16
задан ANisus 18 June 2012 в 18:48
поделиться