Interface
if something can do this, then it can be used here.
만약, Sequence type 이 Len(), Less(i, j int) bool, Swap(i, j int) 기능을 할 수 있다면,
그렇다면 Sequence type 은 sort.Sort() 함수호출에 사용할 수 있다.
Interface 는 어떤기능을 수행하기위한 요구사항, 필요조건을 기술하는 기능이다.
어떤기능을 서술하기위해, C++ 처럼 멤버함수형태로 기술한다면,
유사한 코드를 반복해서 작성해야하거나,
상속체계를 반복해서 수정해야하는 상황이 생길수 밖에 없다.
Interface 는 객체로부터 함수를 분리할 수 있게 해주는 장치로 이해하기로 한다.
함수 이름 앞에 붙어있는 "(s Sequence) funcName" 는
C++ 에서 "Sequence::funcName( Sequence & s)" 정도의 의미로 이해하기로 한다.
Interface 는 GO 언어의 주요한 뼈대에 해당한다는 사실을 느낄 수가 있다.
함수와 함수, 함수와 package, 코드와 프로그램 논리가 Interface 를 통해서 연결되는 것이리라고 예상해볼 수 있다.
package main
import "fmt"
import "sort"
func main() {
a := [...] int { 333, 222, 111 }
var b Sequence = a[0:3]
fmt.Println( "a:", a)
fmt.Println( "b:", b)
sort.Sort(b)
fmt.Println( "b:", b)
}
type Sequence []int
// Methods required by sort.Interface
func (s Sequence) Len() int {
return len(s)
}
func (s Sequence) Less(i, j int) bool {
return s[i] < s[j]
}
func (s Sequence) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func (s Sequence) String() string {
str := "["
for i, elem := range s {
if i > 0 {
str += " "
}
str += fmt.Sprint(elem)
}
return str + "]"
}