왜 사용자가 golang의 구조체를 가리키는가? [복제]

Nov 16 2020

Go 둘러보기 튜토리얼에서-

package main

import "fmt"

type Vertex struct {
    X int
    Y int
}

func main() {
    v := Vertex{1, 2}
    p := &v
    p.X = 1e9
    fmt.Println(v)
}

포인터를 할당하는 대신 vX를 수행하여 동일한 값을 얻을 수 있습니다 (p = & v 다음에 pX). 나중에 동일하게 나올 디자인 패턴이 있습니까?

답변

1 Schwern Nov 16 2020 at 16:38

예,하실 수 있습니다 v.X = 1e9. 즉, 예를의 요점, v.X = 1e9그리고 p := &v; p.X = 1e9동일합니다. 포인터의 작동 방식을 보여주는 간단한 예입니다. 실용적이지 않습니다.

구조체를 메서드에 전달하기 시작하면 포인터가 매우 중요해집니다. X를 설정하는 메서드를 작성하고 싶다고 가정 해 보겠습니다. 구조체를 값으로 전달하면 ...

func (v Vertex) setX(newX int) {
    v.X = newX
}

func main() {
    v := Vertex{1, 2}
    v.setX(1e9)
    fmt.Println(v)
}

우리는 {1 2}. 설정되지 않았습니다. 이는 Go가 값을 메서드에 복사 하기 때문 입니다. setX구조체의 복사본에서 작동합니다.

대신 포인터를 전달합니다.

func (v *Vertex) setX(newX int) {
    v.X = newX
}

그리고 이제 우리는 {1000000000 2}. setX구조체에 대한 포인터에서 작업하고 있습니다.

참고 사항 v.setX(1e9)은 실제로 (&v).setX(1e9)있지만 Go가 번역합니다.

장소 포인터가 유용한 유일한 방법은 메소드가 아닙니다. 여러 위치에서 동일한 데이터로 작업하려면 포인터를 사용하십시오.

참조 방법 : 값 대 포인터 및 이동의 여행 : 방법 .