함수에 구조체를 붙이면 메서드가 되고, 안 먹이면 그냥 함수가 되는 걸로 생각하자...

인터페이스는 구조체에 있는 같은 이름의 메서드를 묶어 주는 것 정도로 생각하자...


구성

// 선언된 구조체가 있으면

func (변수명 구조체명) 함수명() 반환자료형 {

// 변수명.멤버변수명 갖고 블라블라

}


// 사용

구조체명.함수명()


예시 메서드 - https://play.golang.org/p/8ImmuhbhvCA

package main


import (

"fmt"

"strings"

)


// Words : 함수나 구조체 전역 사용시 첫글자를 대문자, 지역 사용시 첫글자를 소문자

type Words struct {

word string

}




func (w Words) swap() string {

tmpRune := []rune(w.word)

a := []string{string(tmpRune[0])}

b := []string{string(tmpRune[1])}


result := append(b, a...)

return strings.Join(result, "")

}


func main() {

myStr := Words{word: "새개"}

fmt.Println("hello " + myStr.word)

fmt.Println("What the " + myStr.swap())

}


예시 인터페이스 - https://play.golang.org/p/FWzmmdzeK1Q

package main


import (

"fmt"

"reflect"

"strconv"

)


/* 구조체, 메서드 */

type myString struct {

a string

b string

}


type myNum struct {

a int

b int

}


func (s myString) sum() string {

return s.a + s.b

}


func (n myNum) sum() string {

return strconv.Itoa(n.a + n.b)

}


/* 구조체, 메서드 */


/* 인터페이스 #1 */

type myObj interface {

sum() string

}


func printString(o myObj) {

sumed := o.sum()

typed := reflect.TypeOf(sumed)

fmt.Println(sumed, typed)

}


/* 인터페이스 #1 */


/* 인터페이스 #2 */

type myObjItf interface {

sumItf() interface{}

}


func (s myString) sumItf() interface{} {

return s.a + s.b

}


func (n myNum) sumItf() interface{} {

return n.a + n.b

}


func printItf(o myObjItf) {

sumed := o.sumItf()

typed := reflect.TypeOf(sumed)

valued := reflect.ValueOf(sumed)


sumedStr := ""


if str, ok := sumed.(string); ok {

sumedStr = str

} else {

// interface{} int는 strconv, (string) 다 안 먹힌다. 내가 또 뭘 또 그렇게 잘못 했는데??

sumedStr = fmt.Sprintf("%v", sumed)

}


fmt.Println(sumed)

fmt.Println(typed, valued.Kind())

fmt.Println("쓰트링: " + sumedStr)

}


/* 인터페이스 #2 */


func main() {

// 인터페이스 #1

var x myObj = myString{a: "안녕", b: "세상"}

var y myObj = myNum{a: 1, b: 2}


printString(x)

printString(y)


// 인터페이스 #2

var j myObjItf = myString{a: "헬로", b: "월드"}

var k myObjItf = myNum{a: 10, b: 20}


printItf(j)

printItf(k)

}



끝.