구글 go 언어를 공부하면서 몇몇 중요 포인트를 메모중입니다. (3/N)
By SeukWon Kang
그 세번째 입니다.
이전글은 http://kasw.blogspot.com/2012/09/go-2n.html
Interface Interface는 object의 behavior 를 규정한다. ( 수행 가능한 method 들의 signature 를 정의한다. ) type InterfaceNamer interface { Method1( params ) returns Method2( params ) returns } 관용적으로 er로 끝나는 이름을 사용한다. ( Printer, Reader, Logger 등등 ) 가능한 짦게 만든다 ( primitive 하게 만든다 ) var interfaceReference InterFaceNamer = someObject struct를 정의할때 어떤 interface를 구현하는지 지정할 필요가 없다. interface에 정의된 method가 구현되어 있다면 자동으로 사용가능하다. func test1() { areas := [2]calcArea{} areas[0] = new( Struct1) areas[1] = new( Struct2) for i,v := range areas { fmt.Printf("%v %v\n",i, v.Area() ) } } type Struct1 struct { side1 int } func ( v *Struct1) Area() int { return v.side1 * v.side1 } type Struct2 struct { side2 int } func ( v *Struct2) Area() int { return v.side2 * v.side2 } type calcArea interface { Area() int } 위와 같이 서로 다른 type의 object가 같은 interface를 구현하고 있는 경우 array 를 만들거나 루프를 돌면서 interface의 method를 실행하는 것이 가능하다. interface는 다른 interface를 embedding하는 것이 가능하다. type calcArea2 interface { calcArea anotherMethod(a int ) bool } runtime시에 interface 변수에 들어 있는 object의 type을 검사,변환,사용 하고 싶으면 if v,ok := areas[0].(Struct1) ; ok { // use v as Struct1 } 형태를 사용한다. 여러 type의 경우에 대해 처리 하고 싶으면 type-switch 구문을 사용한다. fallthrough 사용 불가. switch t:= areas[i].(type) { case Struct1 : case Struct2: case nil : default : } 역으로 object가 interface를 구현하고 있는지 검사하는 것도 가능하다. if iobj , ok := obj.(calcArea) ; ok { // } 응용예 empty interface를 사용하면 사실상 void * 와 같은 효과를 얻을수 있다. type Any interface{} type GeneralArray struct { a []Any } 사용할땐 type-switch 를 활용한다.
슬슬 지겨워 지고 있습니다만 다음이 마지막이 될듯.