私はGolangにスーパーで新しく、言語の周りの大きな話題が同時性と思われるのを見て、私のつま先を濡らす良い方法が一般化されたマップ関数。 psudoコードで:空のインタフェースを持つコンカレントマップ関数をGOlangで一般化する
map(F funtion,A array){
return([F(k) for k in A])
}
明らかに私は各F(k)の計算が同時に起こりたいと思います。組織のために、私の実装にはメインファイルがあり、必要な定義にはサポートファイルがあります。
.
├── main.go
└── Mr
└── Mr.go
主な結果の各メンバーは、入力配列内の対応する文字列の長さintの配列に文字列の配列を変換する必要があり、単純なテストの実装です。
package main
import(
"fmt"
"./Mr"
)
func exfunc(i int, c chan int){
c<-i
}
func main(){
data := make(map[int]string)
data[1]="these"
data[2]="are"
data[3]="some"
data[4]="words"
data[5]="and a few more..."
f := func(w string)int{
return(len(w))
}
testMr := Mr.Map(f,data) // this is line 22 (matters later)
fmt.Println(testMr)
}
すべての型を明示的に指定すると、私のMr.Map関数にはうまくいきます。
package Mr
type result struct{
key,value int
}
func wrapper(f func(string) int,k int,v string, c chan result){
c <- result{k,f(v)}
}
func Map(f func(string) int,m map[int]string) map[int]int{
c := make(chan result)
ret := make(map[int]int)
n := 0
for k := range m{
go wrapper(f,k,m[k],c)
n++
}
for ;n>0; {
r := <-c
ret[r.key]=r.value
n--
}
return(ret)
}
しかし、私は空のインターフェイスでこのマッピングを一般化することができると期待していました。
package Mr
type T interface{}
type result struct{
key,value T
}
func wrapper(f func(T) T,k T,v T, c chan result){
c <- result{k,f(v)}
}
func Map(f func(T) T,m map[T]T) map[T]T{
c := make(chan result)
ret := make(map[T]T)
n := 0
for k := range m{
go wrapper(f,k,m[k],c)
n++
}
for ;n>0; {
r := <-c
ret[r.key]=r.value
n--
}
return(ret)
}
残念ながら、私はこのgeneralize Mr.Mapでmainを実行すると、次のエラーが発生します。
# command-line-arguments
./main.go:22: cannot use f (type func(string) int) as type func(Mr.T) Mr.T in argument to Mr.Map
./main.go:22: cannot use data (type map[int]string) as type map[Mr.T]Mr.T in argument to Mr.Map
はそうそう、明らかに私はエラーが私に言っているか理解が、それは私がキーと値の種類の組み合わせごとにマイマップ機能を再書き込みしなければならない野生のようです。
Is there a work around here, or is this just the nature of the beast?
あなたのカウンタは正常に機能しますが、これを管理するための組み込み型があります。['sync.WaitGroup'](https://golang.org/pkg/sync/#WaitGroup) 。 – Adrian