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

为什么Go中的字符串不能为零?

司徒啸
2023-03-14
问题内容

The Go Playground上可用的程序读取

package main

import "fmt"

func main() {
    var name string = nil
    fmt.Println(name)
}

并产生一个错误

prog.go:6: cannot use nil as type string in assignment

我了解""是字符串的“零值”。我不明白为什么我不能分配nil给我的string


问题答案:

简单的答案是,
在语言规范中nil未将其定义为类型的有效值。string

…但是也许您想要更长的答案?

nil是指针,接口,通道,切片,映射和函数类型的零值,它表示 未初始化的 状态。

考虑以下变量声明:

var a *SomeType
var b interface{}
var c func()

所有这些变量都有一个代表未初始化状态的值,这很自然。a已被声明为指针,但是当我们还没有指向任何指针时,它将指向什么呢?nil对于这些类型,显然是零值。

对于通道,切片和贴图,其零值nil的原因很简单,即其 实现
必须在使用它们之前必须对其进行显式初始化。这主要是出于性能方面的考虑,所有这些类型都在内部表示为或多或少复杂的数据结构,并且初始化它们不是免费的。

但是,a
string不需要初始化,并且自然的,新的字符串变量的默认零值将是一个空字符串""。因此,根本没有理由nil要使用有效的字符串值,将其添加到规范中只会使语言变得更加复杂且使用起来更加麻烦。

此外,nil类型string 代表 什么?空字符串?我们已经有了。未初始化的字符串?没有这样的事情。



 类似资料:
  • 问题内容: Oracle Java Community网站上的一篇文章提供了以下方法作为示例(对于JPA Converter,但这并不相关): 将String y强制转换为String val有什么用?有正当的理由吗? 原始文章:JPA的新增功能 问题答案: 这样的转换是完全没有必要的。我可以想象那是以前 但是后来参数类型更改为,而作者只是忘了删除强制类型转换。

  • 这应该很容易完成,但是当我尝试将字符串转换为整数时,这些命令返回错误: Android monitor返回以下错误: 提前致谢

  • 问题内容: 我想分割一个具有如下内容的字符串: 但是当我使用时: 它不能识别$并且不分割字符串,但是当我用$像X这样的字母替换$时,它可以工作。有人有什么主意吗? 问题答案: split函数需要一个正则表达式(而不是字符串)进行匹配。您的正则表达式使用特殊字符-在本例中为’$’-因此您需要对其进行更改以转义该字符: 还要注意,split返回一个字符串数组- 字符串是不可变的,因此无法修改。对Str

  • 问题内容: 我有一个大小字节数组,做完之后。 错误: 我找到解决这个问题的方法 改成: 但是为什么不能这样使用它呢? 问题答案: 简短的答案是因为Go语言规范不允许这样做。 引用Go语言规范:转换: 在以下任何一种情况下,可以将非恒定值转换为类型: 可分配给。 的类型,并且具有相同的基础类型。 的类型和是未命名的指针类型,它们的指针基类型具有相同的基础类型。 x的类型均为整数或浮点类型。 x的类型

  • 问题内容: 我不明白为什么这个简单的代码行不起作用: 它正在输出“ SomeVariable is $ someVariable”,而不是数字0。是否缺少某些内容或必须启用某些配置选项? 问题答案: 那是因为您需要使用双引号来代替。当用单引号引起来时,php不会将变量转换为它们的值