개요
코드
package study
import "fmt"
type Pos struct {
x, y int
}
var globalPos Pos
var globalPosPtr *Pos
var globalNum int
var globalNumPtr *int
var globalSlice []int = make([]int, 2)
var globalSlicePtr *[]int
var globalMap map[int]int
var globalMapPtr *map[int]int
var globalChan chan int
var globalChanPtr *chan int
func VariableTest() {
localPos := Pos{}
localPosPtr := &Pos{}
var localNum int
var localNumPtr *int
var localSlice []int
localSlice = []int{1, 2}
var localSlicePtr *[]int
var localMap map[int]int
var localMapPtr *map[int]int
var localChan chan int
var localChanPtr *chan int
fmt.Printf("globalPos:\t %p\n", &globalPos)
fmt.Printf("globalNum:\t %p\n", &globalNum)
fmt.Printf("globalSlice:\t %p %p %p\n", &globalSlice, &globalSlice[0], &globalSlice[1])
fmt.Printf("globalMap:\t %p\n", &globalMap)
fmt.Printf("globalChan:\t %p\n", &globalChan)
fmt.Printf("globalPosPtr:\t %p\n", &globalPosPtr)
fmt.Printf("globalNumPtr:\t %p\n", &globalNumPtr)
fmt.Printf("globalSlicePtr:\t %p\n", &globalSlicePtr)
fmt.Printf("globalMapPtr:\t %p\n", &globalMapPtr)
fmt.Printf("globalChanPtr:\t %p\n", &globalChanPtr)
fmt.Printf("localPos:\t %p\n", &localPos)
fmt.Printf("localNum:\t %p\n", &localNum)
fmt.Printf("localSlice:\t %p %p %p\n", &localSlice, &localSlice[0], &localSlice[1])
fmt.Printf("localMap:\t %p\n", &localMap)
fmt.Printf("localChan:\t %p\n", &localChan)
fmt.Printf("localPosPtr:\t %p\n", &localPosPtr)
fmt.Printf("localNumPtr:\t %p\n", &localNumPtr)
fmt.Printf("localSlicePtr:\t %p\n", &localSlicePtr)
fmt.Printf("localMapPtr:\t %p\n", &localMapPtr)
fmt.Printf("localChanPtr:\t %p\n", &localChanPtr)
}
출력
globalPos: 0x104d13100
globalNum: 0x104d12ef8
globalSlice: 0x104ce4250 0x1400012c010 0x1400012c018
globalMap: 0x104ce3df0
globalChan: 0x104ce3de0
globalPosPtr: 0x104ce3e08
globalNumPtr: 0x104ce3e00
globalSlicePtr: 0x104ce3e10
globalMapPtr: 0x104ce3df8
globalChanPtr: 0x104ce3de8
localPos: 0x1400012c020
localNum: 0x1400012c008
localSlice: 0x1400011e018 0x1400012c040 0x1400012c048
localMap: 0x14000126030
localChan: 0x14000126040
localPosPtr: 0x14000126018
localNumPtr: 0x14000126020
localSlicePtr: 0x14000126028
localMapPtr: 0x14000126038
localChanPtr: 0x14000126048
추론
- 전역 변수와 로컬 변수의 메모리 주소 영역이 완전히 다름
- 메모리 영역은 일반 변수, Slice 포인터 변수, 포인터 변수 세 영역으로 나뉨
- map, chan은 기본적으로 포인터(기본형, 포인트형의 메모리 영역이 동일), Slice도 포인터지만 별도의 영역을 사용
- 로컬 및 전역 Slice의 원소의 메모리 영역은 일반 로컬 변수의 영역과 동일
결론
- 전역 변수는 로컬 변수보다 메모리 주소대가 낮음
-> 전역 변수는 데이터 영역
- 로컬 일반 변수는 로컬 포인터 변수보다 메모리 주소대가 높음
-> 로컬 일반 변수는 스택 영역, 로컬 포인터 변수는 힙 영역
- (몇차례 더 테스트 해본 결과) 로컬 Slice 변수는 메모리 주소대가 랜덤
-> Slice는 포인터이고, 가비지컬렉션에 의해 정리되므로 힙 영역으로 추정