[golang] 구조체 초기화/메소드 예제
go 언어의 구조체는 struct으로 사용할 수 있다.
package main
import "fmt"
func main() {
type Rectangle struct {
X1 int
Y1 int
X2 int
Y2 int
}
rect := Rectangle{1,1,5,5}
fmt.Println(rect)
rect.X1 = 10
fmt.Println(rect)
}
결과
{1 1 5 5}
{10 1 5 5}
strcuct를 바깥에 두어도 동일하게 동작한다.
package main
import "fmt"
type Rectangle struct {
X1 int
Y1 int
X2 int
Y2 int
}
func main() {
rect := Rectangle{1,1,5,5}
fmt.Println(rect)
rect.X1 = 10
fmt.Println(rect)
}
struct를 포인터로 가르킬 수 있다.
func main() {
rect := Rectangle{1,1,5,5}
fmt.Println(rect)
rect.X1 = 10
fmt.Println(rect)
r := &rect
r.Y1 = 1e2
fmt.Println(r)
fmt.Println(*r)
fmt.Println(r==&rect)
}
{1 1 5 5}
{10 1 5 5}
&{10 100 5 5}
{10 100 5 5}
true
struct의 인스턴스를 생성할 때 p := new(구조체_이름) 또는 var p *구조체_이름 = new(구조체_이름)을 사용할 수 있다.
package main
type Rectangle struct {
X1 int
Y1 int
X2 int
Y2 int
}
func main() {
p := new(Rectangle)
p.X1 = 1
println(p)
println(p.X1)
println(p.X2)
}
package main
type Rectangle struct {
X1 int
Y1 int
X2 int
Y2 int
}
func main() {
var p *Rectangle = new(Rectangle)
p.X1 = 1
println(p)
println(p.X1)
println(p.X2)
}
이전 두 예제의 결과는 다음과 같다.
0xc42003ff58
1
0
구조체의 초기화를 제공하지는 않지만 앱단에서 구조체에 대한 초기화 함수를 생성할 수 있다.
package main
import "fmt"
type Rectangle struct {
X1 int
Y1 int
X2 int
Y2 int
}
func main() {
rect := newRectangle()
fmt.Println(rect)
}
func newRectangle() *Rectangle {
r := Rectangle{}
r.X1 = -1
r.X2 = -1
r.Y1 = -1
r.Y2 = -1
return &r
}
결과는 다음과 같다.
&{-1 -1 -1 -1}
메소드 예제이다.
1번째 예제는 함수에서 구조체를 리턴하는 것이고,
2번째 예제는 함수에서 구조체를 참조하는 형태이다.
package main
import "fmt"
type Rectangle struct {
X1 int
Y1 int
X2 int
Y2 int
}
func main() {
rect := newRectangle()
fmt.Println(rect)
// 1
newRect := rect.init0()
fmt.Println(newRect)
// 2
newRect.init1()
fmt.Println(newRect)
}
func newRectangle() *Rectangle {
r := Rectangle{}
r.X1 = -1
r.X2 = -1
r.Y1 = -1
r.Y2 = -1
return &r
}
func (r Rectangle) init0() Rectangle {
r.X1 = 0
r.X2 = 0
r.Y1 = 0
r.Y2 = 0
return r
}
func (r *Rectangle) init1() {
r.X1 = 1
r.X2 = 1
r.Y1 = 1
r.Y2 = 1
}
결과
&{-1 -1 -1 -1}
{0 0 0 0}
{1 1 1 1}