[golang] 동일한 문자열 메모리 공유

2024. 10. 28. 16:55·Language/Go

같은 문자열은 같은 주소

Go 언어에서 동일한 값의 문자열을 가진 string 변수가 여러 개 있을 경우 같은 메모리를 공유한다.

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	owner := "Jae-Sung"
	author := "Jae-Sung"

	ownerAddr := (*[2]uintptr)(unsafe.Pointer(&owner))[0]
	authorAddr := (*[2]uintptr)(unsafe.Pointer(&author))[0]

	fmt.Printf("owner addr: %x\n", ownerAddr)
	fmt.Printf("author addr: %x\n", authorAddr)
}

출력 결과

owner addr: 4b0514
author addr: 4b0514

string 타입은 내부적으로 0번 인덱스에 문자열이 담긴 메모리 주소, 1번 인덱스에는 메모리 길이를 가지고 있다.

코드에서 0번 인덱스를 참조해서 두 변수의 메모리 주소를 가져와서 출력했는데 메모리 주소가 같다.

그래서 이 후 두 변수 중 하나의 문자열 값을 바꿔서 출력해봤다.

 

문자열을 변경하면 주소도 변경

author = "Jaesung"
ownerAddr = (*[2]uintptr)(unsafe.Pointer(&owner))[0]
authorAddr = (*[2]uintptr)(unsafe.Pointer(&author))[0]

fmt.Printf("owner addr: %x\n", ownerAddr)
fmt.Printf("author addr: %x\n", authorAddr)

출력 결과

owner addr: 4b051b
author addr: 4b030e

변경된 변수가 가르키는 메모리 주소는 변경되었다.

해당 변수를 다시 원래 값으로 되돌려봤다.

 

같은 문자열로 변경하면 주소도 원래대로

author = "Jae-Sung"
ownerAddr = (*[2]uintptr)(unsafe.Pointer(&owner))[0]
authorAddr = (*[2]uintptr)(unsafe.Pointer(&author))[0]

fmt.Printf("owner addr: %x\n", ownerAddr)
fmt.Printf("author addr: %x\n", authorAddr)

출력 결과

owner addr: 4b051b
author addr: 4b051b

두 변수가 가르키는 메모리 주소가 다시 같아졌다.

Go로 작성한 프로그램에서 상대적으로 메모리 점유를 적게하는 느낌을 받았었다.

같은 문자열일 때 메모리를 공유하는 이런 특성이 그런 느낌을 주는 하나의 이유인 것 같다.

'Language > Go' 카테고리의 다른 글

[golang] sync.WaitGroup으로 고루틴 작업 기다리기  (0) 2024.11.09
[golang] html/template 패키지로 동적 페이지 처리하기  (3) 2024.11.07
[golang] json.Marshal에서 HTML 이스케이프 문제  (3) 2024.10.31
[golang] reflect 패키지를 사용한 외부 패키지의 private 필드 접근하기  (0) 2024.10.30
[golang] cgo에서 Go와 C 언어 간의 버퍼 전달  (2) 2024.10.29
'Language/Go' 카테고리의 다른 글
  • [golang] html/template 패키지로 동적 페이지 처리하기
  • [golang] json.Marshal에서 HTML 이스케이프 문제
  • [golang] reflect 패키지를 사용한 외부 패키지의 private 필드 접근하기
  • [golang] cgo에서 Go와 C 언어 간의 버퍼 전달
在晟
在晟
  • 在晟
    Jae-Sung
    在晟
  • 전체
    오늘
    어제
    • 분류 전체보기 (25)
      • Language (23)
        • Go (23)
      • DBMS (1)
        • MariaDB (1)
      • Notes (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Jae-Sung
    • GitHub
  • 인기 글

  • 태그

    티스토리챌린지
    Runtime
    interface{}
    filepath
    fasthttp
    오블완
    unsafe
    http
    go
    recover
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
在晟
[golang] 동일한 문자열 메모리 공유
상단으로

티스토리툴바