3

動機付けの例:

ジョブのリストをソートするさまざまなスケジューリング「戦略」を実装します。

type Job struct {
    weight int
    length int
}

// Given a slice of Jobs, re-order them.
type Strategy func([]Job) []Job

func Schedule(jobs []Job, strat Strategy) []Job {
    return strat(jobs)
}

非常に単純な戦略の 1 つは、最短のジョブを最初に実行することです (重みや優先度を無視します)。

func MinCompletionTimes(job []Job) []Job {
    // Hmm...   
}

さて、この戦略は job.length の並べ替えに過ぎないので、並べ替えパッケージを使用しましょう。カスタム型を定義し、sort.Interface... を実装します。

type JobSlice []Job // Should probably be called MinCompletionTimesJobSlice

func (js JobSlice) Len() {
    return len(js)
}

func (js JobSlice) Less(i, j int) bool {
    return js[i].length < js[j].length
}

func (js JobSlice) Swap(i, j int) {
    js[i], js[j] = js[j], js[i]
}

万歳、では簡単な戦略に戻りましょう...

func MinCompletionTimes(jobs []Job) []Job {
    sort.Sort([]JobSlice(jobs)) // cannot convert jobs (type []Job) to type []JobSlice
    return jobs
}

ええと...

4

1 に答える 1

4

まず、 のJobsように使っていても、どこにも definedが表示されませんjobs []Jobs

私はあなたが意味していると思うJobのでcannot convert jobs (type []Job)、あなたがやっているとき[]Jobs、あなたは本当に意味していると思います[]Job.


もしそうなら、これで、 yJobのスライスを のスライスに変換しようとしていJobSliceます[]Job

[]JobSlice(jobs) // converting a slice of Job to a slice of slices of Job?

[]Jobつまり、効果的に変換しようとしています[][]Job[]Job代わりに、あなたはあなたをに変換したかっただけだと思いますJobSlice

JobSlice(jobs)

したがって、一連のコードを取り出すと、この変換が機能することがわかります。

type Job struct {
    weight int
    length int
}

type JobSlice []Job

func main() {
    x := []Job{{},{}}

    y := JobSlice(x)
    z := []Job(y)

    fmt.Println(x, y, z)
}
于 2012-12-06T21:48:20.997 に答える