👉 https://gobyexample.com 의 예제를 클론 코딩하며 정리한 글 입니다.
Struct
- go언어의 구조체는 가변이다
- type 구조체이름 struct{ 변수들 }로 선언할 수 있다.
- 보통 사용자가 생성자를 만들어 캡슐화하며, 이때 반환값은 포인터로하여 스코프를 지나도 남도록 해야한다.
- struct를 임베드하여 사용 할 경우 임베드된 struct의 메소드는 임베드 한 상위 객체의 메소드가 된다.
package main
import "fmt"
type person struct {
name string
age int
}
func newPerson(name string) *person {
p := person{name: name}
p.age = 42
return &p
}
func main() {
fmt.Println(person{"Bob", 20})
fmt.Println(person{name: "Alice", age: 30})
fmt.Println(person{name: "Fred"})
fmt.Println(&person{name: "Ann", age: 40})
fmt.Println(newPerson("Jon"))
s := person{name: "Sean", age: 50}
fmt.Println(s.name)
sp := &s
fmt.Println(sp.age)
sp.age = 51
fmt.Println(sp.age)
}
Method
- go 언어는 구조체타입에 메소드를 정의할 수 있습니다.
- go 언어의 메소드는 receiver 타입으로 포인터, 값 둘 다 받을 수 있다.
- 만약 메소드를 호출할 때 receiver 타입에 맞지 않는 값이 오더라도 알아서 맞는 타입으로 변환해준다.
package main
import "fmt"
type rect struct {
width, height int
}
func (r *rect) area() int {
return r.width * r.height
}
func (r rect) perim() int {
return 2*r.width + 2*r.height
}
func main() {
r := rect{width: 10, height: 5}
fmt.Println("area: ", r.area())
fmt.Println("perim:", r.perim())
rp := &r
fmt.Println("area: ", rp.area())
fmt.Println("perim:", rp.perim())
}
Interface
- go 언어에서 인터페이스는 method signature(메소드 이름과 매개변수 리스트의 조합)의 집합이다.
- go 언어에서 인터페이스를 구현하기 위해선 구현하고 싶은 구조체를 receiver로 설정하고 메서드를 전부 구현하면 된다
package main
import (
"fmt"
"math"
)
type geometry interface {
area() float64
perim() float64
}
type rect struct {
width, height float64
}
type circle struct {
radius float64
}
func (r rect) area() float64 {
return r.width * r.height
}
func (r rect) perim() float64 {
return 2*r.width + 2*r.height
}
func (c circle) area() float64 {
return math.Pi * c.radius * c.radius
}
func (c circle) perim() float64 {
return 2 * math.Pi * c.radius
}
func measure(g geometry) {
fmt.Println(g)
fmt.Println(g.area())
fmt.Println(g.perim())
}
func main() {
r := rect{width: 3, height: 4}
c := circle{radius: 5}
measure(r)
measure(c)
}