gpt4 book ai didi

string - 我如何在 Go 中表示可选字符串?

转载 作者:IT王子 更新时间:2023-10-29 01:07:23 26 4
gpt4 key购买 nike

我希望建模一个可以有两种可能形式的值:不存在或字符串。

执行此操作的自然方法是使用 Maybe String , 或 Optional<String> , 或 string option等等。但是,Go 没有这样的变体类型。

然后我想,按照 Java、C 等,替代方案是可空性,或 nil在去。然而,nil不是 string 的成员输入 Go。

搜索,然后我想到使用类型 *string .这可以工作,但看起来很尴尬(例如,我不能像获取结构文字的地址那样获取字符串文字的地址)。

在 Go 中为这样的值建模的惯用方法是什么?

最佳答案

一个合乎逻辑的解决方案是使用 Ainar-G 提到的 *stringThis other answer详细说明获取指向值的指针的可能性(int64 但同样适用于 string)。包装器是另一种解决方案。

仅使用字符串

一个可选的string 表示一个string 加上1 个表示“不是字符串”(而是一个null)的特定值(或状态)。

这 1 个特定值可以存储(信号化)在另一个变量(例如 bool)中,您可以打包 stringbool进入一个 struct ,我们到达了包装器,但这不适合“仅使用一个 string” 的情况(但仍然是一个可行的解决方案)。

如果我们只想使用一个string,我们可以从string类型的可能值中取出1个特定值(它有“无限”个可能值因为长度没有限制(或者可能是因为它必须是 int 但没关系)),我们可以将这个特定值命名为 null 值,表示“不是字符串”的值。

表示null最方便的值是string的零值,也就是空的string:""。将此指定为 null 元素的便利之处在于,每当您创建 string 变量而未明确指定初始值时,它将使用 "" 进行初始化.此外,当从 map 中查询值为 string 的元素时,如果键不在 map< 中,也会产生 ""/.

此解决方案适用于许多现实生活中的用例。例如,如果可选的 string 应该是一个人的名字,一个空的 string 并不真正意味着一个有效的人名,所以你不应该首先允许它地方。

当然,在某些情况下,空 string 确实表示 string 类型变量的有效值。对于这些用例,我们可以选择另一个值。

在 Go 中,string 实际上是字节的只读 slice 。请参阅博文 Strings, bytes, runes and characters in Go其中详细解释了这一点。

所以 string 是一个 byte slice ,在有效文本的情况下是 UTF-8 编码的字节。假设您想在可选的 string 中存储一个有效文本(如果您不想,那么您可以只使用一个 []byte 而不是它可以有一个 nil 值),您可以选择代表无效 UTF-8 字节序列的 string 值,因此您甚至不必做出妥协以从可能的字符串中排除有效文本值。最短的无效 UTF-8 字节序列只有 1 个字节,例如 0xff(还有更多)。注意:您可以使用 utf8.ValidString()判断 string 值是否为有效文本(有效的 UTF-8 编码字节序列)的函数。

您可以将这个异常值设为const:

const Null = "\xff"

这么短也意味着检查 string 是否等于这个会非常快。
按照这个约定,您已经有了一个可选的 string,它也允许空的 string

Go Playground 上试试.

const Null = "\xff"

func main() {
fmt.Println(utf8.ValidString(Null)) // false

s := Null
fmt.Println([]byte(s)) // [255]
fmt.Println(s == Null) // true
s = "notnull"
fmt.Println(s == Null) // false
}

关于string - 我如何在 Go 中表示可选字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30731687/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com