go언어 Struct & Method & Interface

POII·2022년 10월 17일
0

go_study

목록 보기
4/7
post-custom-banner
👉 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)
}
profile
https://github.com/poi1649/learning
post-custom-banner

0개의 댓글