> 백엔드 개발 > Golang > Go 구조체를 역참조하면 복사본이 생성되나요, 아니면 참조가 생성되나요?

Go 구조체를 역참조하면 복사본이 생성되나요, 아니면 참조가 생성되나요?

DDD
풀어 주다: 2024-12-13 03:11:12
원래의
501명이 탐색했습니다.

Does Dereferencing a Go Struct Create a Copy or a Reference?

Go에서 구조체 역참조: 새 복사본 생성

Go에서 구조체로 작업할 때 역참조 동작을 이해하는 것이 중요합니다. 객체를 역참조하면 본질적으로 객체가 가리키는 값의 복사본이 반환됩니다. 역참조가 일반적으로 객체 자체를 반환하는 다른 언어를 사용하는 일부 프로그래머에게는 이는 직관에 어긋날 수 있습니다.

다음 Go 코드 조각을 고려하세요.

package main

import (
    "fmt"
)

type me struct {
    color string
    total int
}

func study() *me {
    p := me{}
    p.color = "tomato"
    fmt.Printf("%p\n", &p.color)
    return &p
}

func main() {
    p := study()
    fmt.Printf("&p.color = %p\n", &p.color)

    obj := *p
    fmt.Printf("&obj.color = %p\n", &obj.color)
    fmt.Printf("obj = %+v\n", obj)

    p.color = "purple"
    fmt.Printf("p.color = %p\n", &p.color)
    fmt.Printf("p = %+v\n", p)
    fmt.Printf("obj  = %+v\n", obj)

    obj2 := *p
    fmt.Printf("obj2 = %+v\n", obj2)
}
로그인 후 복사

이 예에서 Study() 함수는 새로운 me 구조체를 생성하고 이에 대한 포인터를 반환합니다. 그런 다음 이 포인터를 변수 p에 할당합니다. p를 역참조하고 이를 obj에 할당하면 구조체의 새 복사본이 생성됩니다. 이 새 복사본은 p가 가리키는 원래 구조체와 다른 메모리 주소를 갖습니다.

이는 obj의 필드를 변경해도 원래 구조체의 필드에 영향을 주지 않으며 그 반대의 경우도 마찬가지라는 의미입니다. 원래 구조체에 대한 참조를 만들려면 p에서 obj로 포인터를 할당해야 합니다.

obj := p
로그인 후 복사

이 경우 obj와 p는 동일한 구조체를 가리키며 하나에 대한 모든 변경 사항은 다음과 같습니다. 다른 사람에게 반영됩니다.

위 내용은 Go 구조체를 역참조하면 복사본이 생성되나요, 아니면 참조가 생성되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿