Go의 포인터 역참조 이해
Go의 기본 작업인 포인터 역참조에는 포인터 변수가 가리키는 값에 액세스하는 작업이 포함됩니다. 질문에 언급된 예에서 포인터는 사용자 정의 구조체인 Vertex를 조작하는 데 사용됩니다.
포인터 및 구조체
원래 예에서는 Vertex 인스턴스 생성을 보여주었습니다. 포인터를 사용하여 Vertex 인스턴스에 대한 참조를 포함합니다. 수정된 예에서는 다음이 발생합니다.
t := *q q.X = 4
첫 번째 줄은 포인터 q를 역참조하고 기본 값을 t에 할당하여 가리키는 정점의 복사본을 효과적으로 생성합니다. 이후에 q.X를 수정하면 원래 Vertex 인스턴스가 업데이트되지만 t는 구조체의 별도 복사본을 보유하므로 t에 영향을 주지 않습니다.
포인터로 예상치 못한 일 방지
변경 사항을 확인하려면 포인터를 통해 만들어진 내용이 다른 참조에 반영되므로 포인터는 일관되게 사용해야 합니다. 아래 수정된 예에서 t와 q는 모두 동일한 기본 Vertex를 가리킵니다.
t := q
이 변경으로 q.X = 4는 이제 t와 q가 모두 액세스하는 Vertex 인스턴스를 업데이트하여 예상되는 출력을 얻습니다. :
{1 2} &{4 2} {1 0} {0 0} &{4 2} {4 2} true
C/C의 병렬
'매우 이상한 동작'이라는 인식과 달리 C/C는 포인터가 포함될 때 유사한 동작을 나타냅니다. 다음 C 코드는 이를 보여줍니다.
Vertex v = Vertex{1, 2}; Vertex* q = &v; Vertex t = *q; q->x = 4; std::cout << "*q: " << *q << "\n"; std::cout << " t: " << t << "\n";
출력은 수정된 Go 예제와 유사합니다.
*q: { 4, 2 } t: { 1, 2 }
따라서 Go에서 관찰된 포인터 역참조 동작은 포인터의 동작과 일치합니다. C/C와 같은 다른 프로그래밍 언어로.
위 내용은 Go에서 포인터 역참조는 어떻게 작동하며 C/C와 어떻게 비교됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!