k8s 및 go 관련해서 사내 스터디를 진행 중입니다.
근데 struct가 어떻게 동작하는지 헷갈려서 자바와 비교를 하게 되었습니다.
우선 자바 같은 경우에는 class가 있습니다.
이런 식으로 하게 되면, test1 이랑 test2가 같은 객체(메모리 주소 값)를 가지게 됩니다.
test1의 필드를 수정해도 test2의 필드도 같이 수정이 되게 됩니다.
그래서 복사본을 따로 만들어주거나 dto를 사용하는 등 예상치 못한 수정을 막아야 합니다.
그럼 go의 struct도 똑같이 동작을 하는지 궁금했습니다.
s라는 student struct와, tt라는 stude struct가 있습니다.
tt := s 를 이용하여 주면, tt와 s가 같은 메모리 주소의 변수를 이용하고 있는지 궁금했습니다.
이를 실행하면,
이처럼 tt 다음에 ttt가 아닌 ss가 오게 됩니다.
즉, 자바와는 다르게 tt의 이름을 수정을 해도 s의 이름은 수정이 되지 않았습니다.
또한 메모리 주소도 서로 다른 것을 확인할 수 있습니다.
반면에 getStudent() 메소드가 포인터를 반환하게 하면, 서로 같은 메모리를 참조하고 있습니다.
(printf에서 &이 사라진 이유는 포인터 변수가 가리키고 있는 메모리 주소(실제 이용하는 객체(?)의 위치)를 알기 위해서입니다.
이런 식으로 해야 자바처럼 똑같은 메모리의 변수를 바라보게 됩니다.
결론은 go의 struct는 referrence가 아닌 value로 할당을 해주게 되면, 그때마다 메모리에 새로운 값을 할당하고 이를 반환하는 방식인 것을 확인할 수 있었습니다,
'BackEnd > go' 카테고리의 다른 글
[Go] 리소스 상태 유지 (0) | 2024.07.09 |
---|---|
[GO] Rest API 구현 (0) | 2024.07.06 |
[Go] 동시성 패턴 future (0) | 2024.06.29 |
[GO] go를 이용한 안정성 패턴 구현(서킷) (0) | 2024.06.12 |