go - struct

2 분 소요

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라는 키워드는 사용되는지, 상속은 어떻게 이용할 수 있는지도 궁금하네요.

댓글남기기