[Go] 2. pointer, map, arrays

Pointer

포인터 때문에 C를 싫어했는데,, Go에서 다시 만나게 되었다.

 

값 복사 vs 참조

일반적인 변수 할당 (값 복사)

package main

import (
	"fmt"
)

func main() {
	a := 2
	b := a
	a = 10
	fmt.Println(a, b)
}

 

출력 결과

10 2

 

b는 a의 값을 복사한 것이므로, a가 변경되어도 b는 영향을 받지 않는다.

 


 

메모리 주소 확인

변수 앞에 &를 붙이면 해당 변수의 메모리 주소를 확인할 수 있다.

package main

import (
	"fmt"
)

func main() {
	a := 2
	b := 5
	fmt.Println(&a, &b)
}

 

출력 결과

0x14000190020 0x14000190028

 

각 변수는 서로 다른 메모리 주소에 저장된다.

 


 

포인터 변수

b := &a는 "b가 a의 메모리 주소를 가리킨다"는 의미다. 즉, b는 포인터 변수가 된다.

package main

import (
	"fmt"
)

func main() {
	a := 2
	b := &a // b는 a의 주소를 가리킴
	fmt.Println(&a, b)
}

 

출력 결과

0x1400010e020 0x1400010e020

 

&ab가 같은 주소를 출력한다. b가 a의 주소를 저장하고 있기 때문이다.

 


 

포인터를 통한 값 접근

*를 포인터 변수 앞에 붙이면 해당 주소에 저장된 실제 값에 접근할 수 있다.

package main

import (
	"fmt"
)

func main() {
	a := 2
	b := &a
	fmt.Println(*b) // b가 가리키는 주소의 값 출력
}

 

출력 결과

2

 


 

원본 변수를 수정하면?

package main

import (
	"fmt"
)

func main() {
	a := 2
	b := &a
	a = 5
	fmt.Println(*b)
}

 

출력 결과

5

 

a의 값이 변경되면, b가 가리키는 주소의 값도 변경된다.

 


 

포인터를 통해 값 수정하기

package main

import (
	"fmt"
)

func main() {
	a := 2
	b := &a
	*b = 20
	fmt.Println(a) // b가 가리키는 주소의 값을 20으로 변경
}

 

출력 결과

20

 

포인터를 통해 값을 수정하면 원본 변수 a도 변경된다.

 

포인터 정리

- &변수: 변수의 메모리 주소
- *포인터: 포인터가 가리키는 주소의 실제 값
- 포인터를 사용하면 원본 데이터를 직접 수정할 수 있다

 


 

arrays and slice

Slice

Go의 슬라이스는 동적 배열이다. 크기를 미리 지정하지 않아도 되며, append 함수로 요소를 추가할 수 있다.

package main

import "fmt"

func main() {
	names := []string{"Alice", "Bob", "Charlie", "Diana", "Eve"}
	names = append(names, "flynn")
	fmt.Println(names)
}

 

출력 결과

[Alice Bob Charlie Diana Eve flynn]

 


 

Map

Map은 키-값 쌍으로 데이터를 저장하는 자료구조다. Java의 HashMap, Python의 dictionary와 유사하다.

package main

import "fmt"

func main() {
	jihyun := map [string]string{"name": "jihyun", "age": "25"}
	fmt.Println(jihyun)
}

 

출력 결과

map[age:25 name:jihyun]

 


 

Map 순회 - 값만 출력

package main

import "fmt"

func main() {
	jihyun := map [string]string{"name": "jihyun", "age": "25"}
	for _, value := range jihyun {
		fmt.Println(value)
	}
}

 

출력 결과

jihyun
25

 

_ 를 사용해 키를 무시하고 값만 순회한다.

 


 

Map 순회 - 키만 출력

package main

import "fmt"

func main() {
	jihyun := map [string]string{"name": "jihyun", "age": "25"}
	for key, _ := range jihyun {
		fmt.Println(key)
	}
}

 

출력 결과

name
age

 

_를 사용해 값을 무시하고 키만 순회한다.

 


 

참고

Map을 순회할 때 출력 순서는 보장되지 않는다. Go의 Map은 순서를 유지하지 않는 자료구조이기 때문이다.

 

 

아래 강의를 통해 학습한 내용을 바탕으로 작성했습니다.

https://nomadcoders.co/go-for-beginners

 

Go 프로그래밍 언어 무료 강의

Channel, Goroutines 등 Go의 핵심 개념을 익히고, 간단한 스크래핑 서비스를 만들며 실습 위주로 기초부터 배웁니다. 17,000명이 선택한 인기 무료 입문 강의로, 지금 Go 입문을 시작하세요!

nomadcoders.co

 

https://go.dev/doc/#references

 

Documentation - The Go Programming Language

Documentation The Go programming language is an open source project to make programmers more productive. Go is expressive, concise, clean, and efficient. Its concurrency mechanisms make it easy to write programs that get the most out of multicore and netwo

go.dev

 

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

[Go] 4. URL Checker & Go routines & Channel  (0) 2025.11.09
[Go] 3. struct, method, dictionary  (0) 2025.11.08
[Go] 1. package, function, for, if, switch  (0) 2025.11.07