2012-12-06 20 views
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) 
} 

一个非常简单的策略是首先执行最短的工作(不考虑其重量/优先级)。

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

好吧,这个策略只不过是在job.length上排序,所以让我们使用sort包。定义自定义类型,并实施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

首先所有,我没有看到Jobs在任何地方定义,即使您使用它像jobs []Jobs

我想你的意思,因为错误状态​​Job,所以我认为当你做[]Jobs,你真的是[]Job


如果是这样,那么与此,Y你想的Job片转换成的JobSlice片,在其中有一个基本类型的[]Job

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

换句话说,你想转换[]Job有效[][]Job。相反,我觉得你只是想转换您[]JobJobSlice

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) 
} 
相关问题