구조체
참고 자료
1. Struct 타입 - 구조체¶
Struct
struct
란field
라고 불리는 이름을 가진 원소들의 나열 (sequence) 입니다.- 필드의 이름은 명시적으로 나타내어 질 수도 있고(IdentifierList) 또한 그렇지 않을 수도 (EmbeddedField) 있습니다.
struct
에서 non-blank 필드 명은 unique 해야 합니다.
구조체 예시
// An empty struct.
struct {}
// A struct with 6 fields.
struct {
x, y int
u float32
_ float32 // padding
A *[]int
F func()
}
구조체 person 과 다양한 생성 예시
package main
import "fmt"
type person struct {
first string
last string
age int
}
func main() {
haha := person{
"n",
"dy",
17,
}
fmt.Println(haha) // "{n dy 17}"
papa := person{ //
first: "James",
last: "Bond",
age: 42,
}
fmt.Println(papa) // "{James Bond 42}"
// baby := person{"b", "aby"} // too few values in struct literal of type person
baby := person{first: "b", last: "aby"}
fmt.Println(baby) // "{b aby 0}"- it works!
fmt.Println(person{}) // "{ 0}" - it works TOO!
newPerson := new(person)
newPerson.first = "hello"
newPerson.last = "world"
fmt.Println(newPerson) // "&{hello world 0}"
}
2. embedded field¶
embedded field
타입을 가지지만 명시적인 필드 이름을 가지지 않는 필드를 embedded field 라고 부릅니다.
embedded field 는 꼭
- 타입 이름 T 로 식별되거나
- 인터페이스가 아닌 타입 이름 *T
로 식별되거나
- T 자체는 포인터가 타입이 될 수 없어야 합니다. ??
embedded field 예시
// A struct with four embedded fields of types T1, *T2, P.T3 and *P.T4
struct {
T1 // field name is T1
*T2 // field name is T2
P.T3 // field name is T3
*P.T4 // field name is T4
x, y int // field names are x and y
}
field name conflict - illegal struct
struct {
T // conflicts with embedded field *T and *P.T
*T // conflicts with embedded field T and *P.T
*P.T // conflicts with embedded field T and *T
}
3. Promotion¶
promoted
구조체 x 의 (필드) 혹은 (embedded 필드의 메서드) f 는 x.f 가 legal selector 인 경우
promoted
됩니다.
promoted
package main
import "fmt"
type person struct {
first string
last string
age int
}
type secretAgent struct {
person // embedded field with implicit name
ltk bool
}
func main() {
sa := secretAgent{
person: person{"James", "Bond", 42},
ltk: true,
}
fmt.Println(sa) // "{_{James Bond 42} true}"
fmt.Println(sa.first) // "James" - promoted
fmt.Println(sa.last) // "Bond" - promoted
fmt.Println(sa.age) // "42" - promoted
fmt.Println(sa.ltk) // "true"
}
4. Anonymous Struct¶
바로 위의 비밀요원 구조체를 익명 구조체로 변경
package main
import "fmt"
type person struct {
first string
last string
age int
}
func main() {
sa := struct {
person
ltk bool
}{
person: person{"James", "Bond", 42},
ltk: true,
}
fmt.Println(sa) // "{_{James Bond 42} true}"
fmt.Println(sa.first) // "James" - promoted
fmt.Println(sa.last) // "Bond" - promoted
fmt.Println(sa.age) // "42" - promoted
fmt.Println(sa.ltk) // "true"
}
Last update:
May 29, 2023
Created: May 28, 2023
Created: May 28, 2023