go - struct
- 기본적인 go 에서 struct 사용법을 정리하였습니다.
go - struct - basic
- 관련 있는 data들을 묶어서 관리하기 위해서는
struct
를 사용합니다. 기본적인 사용법은 다음과 같죠.
type Student struct {
id string
department Department
num int
}
struct
는 다음과 같이 type을 지정하는 형태로 사용할 수 있으며, 당연히 한 struct에서 다른 struct를 참조하는 것이 가능합니다. 그리고 순서대로 {}
curly bracket을 사용하여 값을 바로 할당해줄 수 있죠. struct
를 정의할 때 정의된 field 순으로 순차적으로 assign됩니다.
package main
import (
"fmt"
)
type Department struct {
name string
}
type Student struct {
id string
department Department
num int
}
func main() {
var s1 Student
var s2 Student
s1.id = "frhyme"
s1.department = Department{"Computer Science"}
s1.num = 1
s2 = s1
s2.id = "abc"
s2.num = 2
fmt.Println(s1)
fmt.Println(s2)
/*
{frhyme {Computer Science} 1}
{abc {Computer Science} 2}
*/
}
go - struct - memory allocation
- go 에서 조금 흥미롭게 느껴지는 것은 struct 내 field를 어떤 순서로 정의하느냐에 따라서 해당 struct에 할당되는 memory의 크기가 변한다는 것입니다. 아래 code에서도 좀 더 자세하게 작성하였으나, 기본적으로 64bit computer에서는 8 byte를 register의 크기로 잡습니다. register는 1번에 CPU가 연산하는 기본 단위, 정도로 이해하시면 됩니다.
- 따라서, golangf에서는 8 byte를 register로 인식하게 되는데요.
int32
의 경우는 4 byte를 차지합니다. 따라서 register의 크기인 8 byte 를 다 채우지 못하죠. 만약 그 다음에 할당되는 field의 크기가 4 byte이하라면 하나의 register 내에 2개의 field가 배정될 수 있습니다. 만약 4 byte 이상이라면 그 다음 register 에 해당 field가 배정되죠.
- 이런 방식으로 배정되기에 field를 어떤 순으로 배정하느냐에 따라서 해당 struct에 할당되는 크기가 달라질 수 있습니다.
package main
import (
"fmt"
"unsafe"
)
/*
64 bit computer에서 register의 크기가 8 byte입니다.
따라서 기본적으로 8 byte의 크기가 할당되죠.
O: 사용하는 byte
X: 사용하지 않는 byte
*/
type SampleType1 struct {
/*
SampleType1 의 경우는 순서대로 4, 8, 4가 사용되므로
아래와 같이 메모리를 사용합니다.
실제로 사용하는 memory는 16 byte이지만,
24 byte가 할당되어 있죠.
OOOO XXXX
OOOO OOOO
OOOO XXXX
*/
age int32 // 4 bytes
gpa float64 // 8 bytes
num int32 // 4 bytes
}
type SampleType2 struct {
/*
SampleType2 의 경우는 순서대로 4, 4, 8이 할당되므로
16 byte가 사용되고 할당됩니다.
OOOO OOOO
OOOO OOOO
*/
age int32 // 4 bytes
num int32 // 4 bytes
gpa float64 // 8 bytes
}
func main() {
/*
64 bit computer에서는 register의 크기가 8 byte입니다.
*/
var st1 = SampleType1{1, 3.4, 1}
var st2 = SampleType2{1, 1, 3.4}
fmt.Println(unsafe.Sizeof(st1)) // 24
fmt.Println(unsafe.Sizeof(st2)) // 16
}
wrap
- c language 말고는
struct
라는 keyword를 사용해본 적이 없는 것 같은데, 오랜만에 struct
를 보니까 반갑네요.
- 이후에 struct 내에서 method를 정의할 수 있는 방법은 있는지,
class
라는 키워드는 사용되는지, 상속은 어떻게 이용할 수 있는지도 궁금하네요.
댓글남기기