>백엔드 개발 >Golang >이러한 구조의 뒤에서 무슨 일이 벌어지고 있는 걸까요? 구조체가 복사됩니까?

이러한 구조의 뒤에서 무슨 일이 벌어지고 있는 걸까요? 구조체가 복사됩니까?

PHPz
PHPz앞으로
2024-02-05 23:27:03902검색

这些结构的幕后发生了什么? struct 会被复制吗?

질문 내용

이 코드에서 무슨 일이 일어나고 있는지 이해할 수 없습니다.

수신기 func는 원래 구조 사용자(포인터 때문에)에서 작동하므로 func 내부에서 원래 obj를 변경합니다. 그러나 구조 주소도 원본 "a"의 원본입니까 아니면 복사본입니까?

으아악

이것이 내 결과물입니다

으아악

이를 통해 u.address가 변경되었음을 이해하고 "u" 안의 "a"가 원래 obj와 다르다는 것도 알 수 있습니다. 그렇다면 무대 뒤에서 그리고 기억 속에서 정확히 무슨 일이 일어나는 걸까요? 출력에 따르면 이 동작은 전혀 예상하지 못한 것입니다. 나는 포인터가 있기 때문에 두 경우 모두 원래 객체("a"와 "u")를 사용할 것으로 예상했습니다. 두 번째로(func 'update..' 이후) fmt.println(a)을 인쇄하면 {peremohy kyiv}가 표시됩니다. 두 번째로 fmt.println(u)가 {valeriy zalyzhnyi {peremohy kyiv}}


를 제공하기 때문입니다. 정답


뒤에서 무슨 일이 일어나고 있는지 이해하려면 코드가 수행하는 작업을 시각화하는 것이 유용할 수 있습니다.

으아악

는 다음과 같이 세분화됩니다.

으아악

그래서 1개의 user{} 实例和 2 个 address{} 인스턴스에 메모리를 할당했습니다. 두 번째 주소 인스턴스의 값은 첫 번째 주소 인스턴스(사본이 생성된 당시)의 정확한 복사본입니다.

이제 updatestreet 时,它是通过指针在 u 上调用的,它不会创建 user 实例的副本,而是对内存地址 0x000002 进行操作,因此它实际上对同一个 a를 호출하면 변수가 동작합니다. 따라서 표현은:

으아악

는 다음과 같이 해석됩니다. 메모리 주소 0x000002에 있는 값에서 address 的字段,在该字段中,访问字段 street라는 값에 액세스하여 새 값을 할당합니다. 이것을 위에서 만든 테이블에 매핑해 보겠습니다.

으아악

함수가 반환된 후에도 이전과 같이 메모리의 동일한 위치에 동일한 개체가 있지만 메모리의 주소를 통해 a 的值,所以 updatestreet 函数所做的更改已经完成为 u 값에 액세스했기 때문입니다(동일한 메모리 주소를 사용했기 때문입니다).

Variable a 在赋值给 u.address 时被复制,因此它的内存地址未知,或者传递给 updatestreet 기능이므로 변경되지 않습니다.

위 내용은 이러한 구조의 뒤에서 무슨 일이 벌어지고 있는 걸까요? 구조체가 복사됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제