【问题标题】:Elegant way to convert a slice of one type to a slice of an equivalent type?将一种类型的切片转换为等效类型的切片的优雅方法?
【发布时间】:2012-11-25 00:36:25
【问题描述】:

一个激励的例子:

实施各种调度“策略”,对作业列表进行排序。

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
}

呃……

【问题讨论】:

    标签: types struct go slice


    【解决方案1】:

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

    我认为你的意思是 Job,因为错误状态为 cannot convert jobs (type []Job),所以我假设当你在做 []Jobs 时,你的意思是 []Job


    如果是这样,那么通过这个,y 你试图将Job 的一个切片转换为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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 2011-12-03
      • 2020-11-02
      相关资源
      最近更新 更多