当前位置: 首页 > 面试题库 >

一种将一种类型的切片转换为等效类型的切片的优雅方法?

欧照
2023-03-14
问题内容

一个激励人的例子:

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

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
}

嗯…


问题答案:

首先, Jobs即使您使用like ,也看不到任何定义 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。相反,我认为您只是想将您的转换[]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)
}


 类似资料:
  • 问题内容: 我正在尝试使用Go语言,并且对它很陌生。我已经成功地完成了教程,现在正在编写一个小程序来评估其通常执行的操作类型的性能。我有一个很长的float32类型切片,需要将其尽可能有效地转换为float64类型的切片。除了遍历slice的元素并通过output [i] = float64(data [i])显式转换单个元素的类型外,还有没有一种方法可以用来转换整个slice而无需迭代?我曾尝试

  • 问题内容: 我刚开始使用Go,所以这很明显。编译器不允许以下代码:(http://play.golang.org/p/3sTLguUG3l) 错误是: 从规格上看,[] string看起来与[] Card不是相同的基础类型,因此无法进行类型转换。 确实是这样,还是我错过了什么? 如果是这样,为什么会这样呢?假设在一个非宠物示例程序中,我输入了一个字符串切片,是否可以将其“投射”到Card切片中,或

  • 问题内容: 我试图了解Go的类型转换规则。假设我们有以下接口: 为了满足这些接口,我们有一个类型: 这两个功能正在使用接口: 要使用这些方法,我可以编写以下内容: 第一个功能按预期工作;一个实现所有需求,这是一个功能。 但是,对于第二个函数,Go不会编译尝试的调用,并报告以下内容: 不能在allWoof的参数中将狗([] woofRunner类型)用作[] woofer类型 使用类型转换也是不可能

  • 问题内容: 我目前正在努力完成出色的“围棋之旅”。我使用以下解决方案完成了其中一项练习(#45): 我不明白为什么我必须使用两次该类型的语句(请参见摘要中的注释)。这似乎是多余的,但我不知道该怎么做。 问题答案: Go中没有其他方法可以做到这一点。 是的,我同意这很冗长,但有必要。第二个make()语句完全独立于第一个。可以争论的是,编译器应该能够从推断类型,但此时还不行。 另一点:如果在第二种情

  • 问题内容: 我想知道为什么你不能做: 我发现这将需要运行时在片上执行循环以转换每个元素,这将是非惯用的Go。这很有道理。 然而,这可能不会被刚刚走样编译器解决的,所以在内部它们是相同的,他们使用相同类型的头底下?我猜答案虽然不是我好奇为什么。 问题答案: 这个: 是类型转换。根据规范,转换具有特定的规则: 在以下任何一种情况下,可以将非恒定值转换为类型: 是分配给。 的类型,并且具有相同的基础类型

  • 假设我们想获取一个 map 类型的切片,我们必须使用两次 make() 函数,第一次分配切片,第二次分配 切片中每个 map 元素(参见下面的例子 8.4)。 示例 8.4 maps_forrange2.go: package main import "fmt" func main() { // Version A: items := make([]map[int]int, 5)