>백엔드 개발 >Golang >Go에서 문자열 리터럴의 주소를 가져올 수 없는 이유는 무엇입니까?

Go에서 문자열 리터럴의 주소를 가져올 수 없는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-10 01:00:11325검색

Why Can't I Take the Address of a String Literal in Go?

Go에서 문자열 리터럴 참조

Go에서 문자열 참조를 사용하면 각 호출에서 메모리 할당을 방지하여 성능 이점을 얻을 수 있습니다. 그러나 아래 예의 test1()에서 시도한 것처럼 문자열 리터럴에 대한 참조를 직접 얻으면 문제가 발생합니다.

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

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

왜 이것이 불가능합니까?

의미가 모호하므로 문자열 리터럴의 주소를 사용하는 것은 금지됩니다. 이러한 모호함은 참조가 상수 자체에 적용되는지 아니면 상수의 복사본에 적용되는지에 중점을 둡니다. 상수의 주소를 사용하면 해당 값이 수정되도록 허용하여 잠재적으로 런타임 오류가 발생할 수 있습니다.

최상의 솔루션

test2()에서 설명한 것처럼 가장 효과적인 솔루션은 문자열 리터럴 대신 기존 변수에 대한 포인터를 사용하는 것이 포함됩니다. 이 접근 방식은 더 장황하지만 Go의 구문을 따르며 명확한 의미 체계를 보장합니다.

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

예외: 복합 리터럴

언어 사양에서는 복합 리터럴에 대한 예외를 만듭니다. test3()에 표시된 대로입니다. 이를 통해 익명 구조체를 생성하고 이후 해당 주소를 검색할 수 있습니다.

func test3() (*string) { return &struct {
        A int
        B int
    }{1, 2} }

이 예외가 존재하는 동안 정적 문자열에 대한 참조를 처리하기 위해 권장되는 접근 방식은 단순성과 명확성을 유지하므로 test2()로 유지됩니다. .

위 내용은 Go에서 문자열 리터럴의 주소를 가져올 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.