함수에 구조체를 붙이면 메서드가 되고, 안 먹이면 그냥 함수가 되는 걸로 생각하자...
인터페이스는 구조체에 있는 같은 이름의 메서드를 묶어 주는 것 정도로 생각하자...
구성
// 선언된 구조체가 있으면
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)
}
끝.
댓글 0