2014-12-25 2 views
6

모든 배열 유형을 처리 할 수 ​​있도록 Map 함수를 작성하려고합니다.golang의 generic 매개 변수에 func을 쓰는 방법

// Interface to specify generic type of array. 
type Iterable interface { 
} 

func main() { 
    list_1 := []int{1, 2, 3, 4} 
    list_2 := []uint8{'a', 'b', 'c', 'd'} 
    Map(list_1) 
    Map(list_2) 
} 

// This function prints the every element for 
// all []types of array. 
func Map(list Iterable) { 
    for _, value := range list { 
     fmt.Print(value) 
    } 
} 

그러나 컴파일 타임 오류가 발생합니다. range 유형은 Iterable 여기 수신 동작을 허용하는 배열 슬라이스 문자열지도 또는 채널로 배열, 포인터를 필요로하기 때문에

19: cannot range over list (type Iterable) 

오류가 맞습니다. 내가 직면하고있는 문제는 인수 형 Iterable을 배열 형으로 변환하는 것입니다. 제발, 제 기능을 제네릭 배열을 처리하는 데 사용할 수있는 방법을 제안하십시오.

답변

5

롭 파이크는

그것은 이동 식 스위치에서 "어떤지도", "어떤 배열"또는 "어떤 조각을"표현 가능 this thread에서 언급으로?

No. 정적 유형은 정확히이어야합니다.
빈 인터페이스는 실제로 유형이며 와일드 카드는 아닙니다.

알려진 기능이있는 인터페이스처럼 특정 유형의 목록 만 반복 할 수 있습니다.
당신은, this thread shows로 될 것 인 interface{}로 조각을 전달하는 "Can we write a generic array/slice deduplication in go?"

에도 사용 반사와 예를 볼 수있는 오류가 발생하기 쉬운 (this example 참조).

+0

인터페이스 인수에서 유형 및 값을 알 수 있습니까? 나는 아직도 그것을 공유 된 예에서 이해하려고 노력하고있다. –

+0

@ subh.singh는 동적이지 않기 때문에,'interface {}'대신에 알려진 인터페이스의 배열로 작업하는 것이 더 낫습니다. – VonC

+1

@ subh.singh 적어도 반사되지 않고 http://play.golang.org/p/jxMFq5UYs1의 비트가 https://www.tbray.org/ongoing/When/201x/2013의 의견에 언급되어 있습니다./07/15/골양 일기 -2. – VonC

0

지도에 대한 정의가 일부 불완전합니다. 그것을 선언하는 일반적인 방법은 매퍼 (mapper) 방법입니다. 귀하의 예는 적어도 이런 식으로

그것은 works

package main 

import "fmt" 

// Interface to specify something thet can be mapped. 
type Mapable interface { 
} 


func main() { 
    list_1 := []int{1, 2, 3, 4} 
    list_2 := []string{"a", "b", "c", "d"} 
    Map(print, list_1) 
    Map(print, list_2) 
} 
func print(value Mapable){ 
fmt.Print(value) 
} 

// This function maps the every element for 
// all []types of array. 
func Map(mapper func(Mapable), list ... Mapable) { 
    for _, value := range list { 
     mapper(value) 
    } 
} 

을 구현할 수있다. 그것이 유형이없는 것 같아요. 아니요, Hindley Milner에서 Go는 generics가 없습니다

+0

배열의 요소에 대해 일부 연산을 수행하려면 리플렉션을 사용해야합니다. 현재 예제에서는 요소에 대한 연산을 수행하지 않고 값을 출력하고 있습니다. –

관련 문제