클래스의 개념과 유사한 Go의 구조체에 대해서 정리합니다.
package main
type House struct {
Address string
Size int
Price float64
Type string
}
type (구조체이름) struct {필드..}
의 포멧으로 선언(필드명) (타입)
의 포멧으로 선언func main() {
// 초깃값 생략.
var house House
// 모든 필드 초기화 1 (한줄)
var house1 House = House{"서울시 서초구", 50, 37.7, "아파트"}
// 모든 필드 초기화 2 (여러줄. 마지막 요소의 끝에는 콤마 필수)
var house2 House = House{
"서울시 강동구",
35,
20.2,
"아파트",
}
// 일부 필드 초기화 1 (한줄)
var house3 House = House{ Size: 28, Type: "아파트"}
// 일부 필드 초기화 2 (여러줄. 마지막 요소의 끝에는 콤마 필수)
var house4 House = House{
Size: 28,
Type: "아파트",
}
print(house1.Name)
}
.
을 이용해 특정 구조체의 내부 필드에 접근 가능house.Address
, house.Size
, ...package main
import "fmt"
type User struct {
Name string
ID string
Age int
}
type VIPUser struct {
UserInfo User
VIPLevel int
Price int
}
func main() {
user := User{"송하나", "하나", 30}
/* 1 */
vip := VIPUser{
user,
3,
1000,
}
fmt.Printf("유저: %s ID: %s 나이: %d\n", user.Name, user.ID, user.Age)
fmt.Printf("[VIP] 유저: %s ID: %s 나이: %d 레벨: %d 가격: %d\n",
/* 2 */
vip.UserInfo.Name,
vip.UserInfo.ID,
vip.UserInfo.Age,
vip.VIPLevel,
vip.Price,
)
}
.
을 이용해 내부 구조체의 내부 필드에 접근vip.UserInfo.Name
, vip.UserInfo.ID
,...
A.B.C
... 처럼 여러단계를 거쳐 접근하는 번거로움을 덜어주는 방법이다.
package main
import "fmt"
type User struct {
Name string
ID string
Age int
}
type VIPUser struct {
/* 1. 필드명 생략 */
User
VIPLevel int
Price int
}
func main() {
user := User{"송하나", "하나", 30}
vip := VIPUser{
user,
3,
1000,
}
fmt.Printf("유저: %s ID: %s 나이: %d\n", user.Name, user.ID, user.Age)
fmt.Printf("[VIP] 유저: %s ID: %s 나이: %d 레벨: %d 가격: %d\n",
/* 2. user를 거치지 않고 User 필드에 바로 접근 가능 */
vip.Name,
vip.ID,
vip.Age,
vip.VIPLevel,
vip.Price,
)
}
type VIPUser struct {
/* 1. 필드명 생략 */
User
VIPLevel int
Price int
}
// Level 필드명이 겹치는 상황
type User struct {
Name string
ID string
Age int
Level int
}
type VIPUser struct {
User
Level int
Price int
}
...
// 해당 구조체에 선언된 필드가 우선시.
// 필드명이 중복되는 다른 내부변수에 접근하고자 할 때는 타입명 네임스페이스를 이용해 접근
vip.Level => VIPUser 객체의 Level 필드
vip.User.Level => VIPUser 내부 User 객체의 Level 필드