Go에서 struct는 Custom Data Type을 표현하는데 사용되는데, Go의 struct는 필드들의 집합체이며 필드들의 컨테이너이다.
Go에서 struct는 필드 데이터만을 가지며, (행위를 표현하는) 메서드를 갖지 않는다.
package main
import (
"fmt"
)
// 다른 패키지에서도 쓰려면 앞글자 대문자
type person struct {
name string
age int
gender bool
}
func main() {
// 객체 생성
p := person{}
// 필드값 설정
p.name = "김두한"
p.age = 10
p.gender = true
// 초기화와 동시에 선언해주어도 된다,
// struct의 값을 지정안해줄 경우 zero value
// 항상 구조체는 선언되어 있어야 할 것
p2 := person{
name : "구마적",
age : 25,
}
// 내장함수 new()를 이용해서 선언, 모든 필드 zero value
fmt.Printf("%+v\n",p)
fmt.Printf("%+v\n", p2)
}
정렬 : 하드웨어에게는 정렬 경계내의 메모리를 일게 하는 것이 효율적이다. 하드웨어가 정렬 경계에 맞춰 읽게 소프트웨어에서 챙겨주는 것이 정렬이다.
특정값의 메모리 크기에 따라 Go는 어떤 정렬이 필요한지 결정한다. 모든 2바이트 크기의 값은 2바이트 경계를 가진다. bool값은 1바이트라서 주소 0번지에서 시작했으면, 다음 int는 2번지에서 시작해야 한다.
- 메모리 정렬은 가장 큰 데이터 타입의 크기에 따라 경계가 정해진다. 즉 가장 큰 메모리 사이즈의 필드가 전체 구조체의 패딩을 결정하게 된다.
- 위와 같은 경우 string이 가장 큰 데이터 타입이기 때문에 복합 타입의 string의 최고 타입인 int가 정렬 경계가 되어 8바이트가 경계가 된다. 때문에 0번지에 16바이트가 할당되고 그 이후 int가 8바이트를 차지를 한 후 bool이 1바이트를 차지를 하면 8바이트 경계에 7바이트가 남게 된다. 이 공간을 패딩이라고 한다.
package anonymoustype
import "fmt"
type test1 struct {
a int
b int
}
type test2 struct {
a int
b int
}
func Anonymoustype() {
var result1 test1
var result2 test2
result1 = test1(result2)
fmt.Printf("같냐? = %v\n",result1 )
}
package anonymoustype
func Namedtyped() {
type Namedtype struct {
count int
}
var test2 struct {
count int
}
var test1 Namedtype
test1=test2
}
위 코드에서 test2 변수에 담긴 구조체는 현재 이름이 선언되어 있지 않는 익명 구조체 타입이다. 이를 Namedtype이라는 이름을 가진 구조체를 타입으로 하는 test1에 test2구조체를 대입하니 성공적으로 대입이 된다.