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

将字符串切片转换为自定义类型的切片

方昊
2023-03-14
问题内容

我刚开始使用Go,所以这很明显。编译器不允许以下代码:(http://play.golang.org/p/3sTLguUG3l)

package main

import "fmt"

type Card string
type Hand []Card

func NewHand(cards []Card) Hand {
    hand := Hand(cards)
    return hand
}

func main() {
    value := []string{"a", "b", "c"}
    firstHand := NewHand(value)
    fmt.Println(firstHand)
}

错误是: /tmp/sandbox089372356/main.go:15: cannot use value (type []string) as type []Card in argument to NewHand

从规格上看,[] string看起来与[] Card不是相同的基础类型,因此无法进行类型转换。

确实是这样,还是我错过了什么?

如果是这样,为什么会这样呢?假设在一个非宠物示例程序中,我输入了一个字符串切片,是否可以将其“投射”到Card切片中,或者是否必须创建一个新结构并将数据复制到其中?(我想避免这种情况,因为我需要调用的函数会修改切片内容)。


问题答案:

的基础类型Card可能与的基础类型string(本身是string)相同,但是的基础类型[]Card与的基础类型不同[]string(因此适用于Hand)。

您不能将的片转换T1为的片T2,这与它们具有什么基础类型T1无关,如果不相同T2,就不能。为什么?因为不同元素类型的切片可能具有不同的内存布局(内存大小不同)。例如,类型的元素[]byte每个占用1个字节。每个元素[]int32占用4个字节。显然,即使所有值都在范围内,也不能将一个转换为另一个0..255

但是要追溯到根本:如果需要切片Cards,为什么首先要创建切片strings?您所创建的 类型 Card,因为它 不是
一个string(或至少不只是一个string)。如果是这样,而您需要[]Card,那么[]Card首先创建,所有问题都将消失:

value := []Card{"a", "b", "c"}
firstHand := NewHand(value)
fmt.Println(firstHand)

请注意,您仍然可以Card使用未 类型化的 常量string 文字
来初始化的切片,因为它可用于初始化其基础类型为的任何类型string。如果要涉及类型化的类型string常量或非常量表达式string,则需要进行显式转换,例如下面的示例:

s := "ddd"
value := []Card{"a", "b", "c", Card(s)}

如果您有一个[]string,则需要从中手动构建一个[]Card。没有“更轻松”的方式。您可以创建一个辅助toCards()函数,以便可以在需要的任何地方使用它。

func toCards(s []string) []Card {
    c := make([]Card, len(s))
    for i, v := range s {
        c[i] = Card(v)
    }
    return c
}


 类似资料:
  • 问题内容: 我想将字符串切片转换为指向字符串的指针切片 %!p(string = a)=>字符串 %!p(string = b)=>字符串 %!p(string = c)=>字符串 [0xc42000e1d0 0xc42000e1d0 0xc42000e1d0] 据我了解, 我的变量似乎是一个字符串,而不是指向字符串的指针。 因此应从迭代时复制。 显然我不正确,因为地址仍然相同。如果值不是指针,该

  • 问题内容: 例如输入:(类型:) 转换示例:(类型:的切片) 问题答案: 除了mhutter的答案外,还请注意您的输入看起来像一个JSON数组(也许是来自JSON文本?)。 如果您这样处理,则可以将其内容编组为一个切片。直接解析其中的数字并不会更快(因为该包使用了反射),但是它肯定更简单: 输出(在Go Playground上尝试):

  • 问题内容: 在这个奇怪的例子中,有人创建了一个新类型,它实际上只是一个字符串: 但是,此代码无法编译: 不能在返回参数中使用Foobar(CustomType类型)作为类型字符串 您将如何修复SomeFunction,使其能够返回Foobar的字符串值(“ somestring”)? 问题答案: 将值转换为字符串:

  • 问题内容: 一个激励人的例子: 实施各种调度“策略”,对“作业”列表进行排序。 一种非常简单的策略是首先执行最短的作业(不考虑其权重/优先级)。 嗯,这种策略只不过是对job.length进行排序,因此让我们使用sort包。定义一个自定义类型,并实现sort.Interface … 好了,现在回到我们的简单策略… 嗯… 问题答案: 首先, 即使您使用like ,也看不到任何定义 。 我认为您的意思

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

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