在Go 规范中写道:
字符串是不可变的:一旦创建,就无法更改字符串的内容。
我有以下代码:
str := "hello"
fmt.Printf("%p\n",&str) // 0x1040c128
fmt.Printf("%v\n",str) // hello
ptr := &str
*ptr = "world"
fmt.Printf("%p\n",&str) // 0x1040c128
fmt.Printf("%v\n",str) // world
我&str
原本希望地址在之后更改*ptr = "world"
。就像Java那样,我们在其中重新分配String引用。
什么是“不变性”?
string
值 是不可变的。
str
不是一个string
值。这是一个 变量 (string
类型)。并且变量的值可能会更改,这就是您对任何编程语言所期望的。
"hello"
是一个string
值,这是不可变的。"world"
是另一个string
值,当您分配"world"
给时str
,您只需为str
变量分配另一个不同的值。是直接对str
还是通过指针进行都没关系。您只是在更改由表示的变量的值str
。
不可变意味着您无法使用string
值"world"
,例如,不能更改其第二个字符。例如,如果您有一个函数接收string
参数,则无论它接收到什么(例如"hello"
),您都可以确保它始终保持不变。无论何时/如何打印此string
值,它始终是"hello"
。
甲string
值是在引擎盖下一个struct值,由表示的reflect.StringHeader
类型:
type StringHeader struct {
Data uintptr
Len int
}
它基本上存储一个数据指针(指向保存文本的UTF-8编码值的字节数组)和该string
值的字节长度。数据数组及其长度不向您公开,因此您无法对其进行修改。这是确保string
值不变的要素之一。另一个要素是,尽管string
可以为值建立索引(索引其字节),但是您不能将新值分配给索引表达式。例如使用该值是有效的"abc"[0]
,但是给它赋一个新值是无效的"abc"[0] = 'x'
。同样,您不能使用索引表达式的地址为string
值建立索引(否则您可以修改指向的值,从而间接修改该string
值)。
这就是语言规范所保证的。请注意,有些方法仍然可以更改string
值,例如使用package
unsafe
,但这超出了规范的保证范围:
不安全的软件包包含绕过Go程序的类型安全的操作。
导入不安全的软件包可能是不可移植的,并且不受Go 1兼容性准则的保护。
导入包的“时刻” unsafe
,您将失去语言规范所提供的任何保证和安全,并且从那时起您就不会有任何抱怨。但是, 如果不
使用这些“特殊”手段,就不会发生string
值被更改的情况。
阅读博客文章Go中的字符串,字节,符文和字符,了解如何在Gostring
中实现和工作。
主要内容:到底使用字符数组还是字符串常量C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在《 C语言字符数组和字符串》中已经进行了详细讲解,这里不妨再来演示一下: 运行结果: https://www.xnip.cn https://www.xnip.cn 字符数组归根结底还是一个数组,上节讲到的关于 指针和数组的规则同样也适用于字符数组。更改上面的代码,使用指针的方式来输出字符串: 运行结果: https://ww
问题内容: 我的应用程序接受来自的指针。 例如 如何使用该指针并获取存储在该位置的值? 问题答案: 免责声明:您可能已经知道,这很危险,如果要在生产应用程序中执行此操作,则最好有一个很好的理由。话虽如此… 您需要做一些事情。这是代码,然后我们将逐步进行介绍。 您可以在Go Playground上运行它。 首先,我们需要将字符串解析为数值。在您的示例中,您给出了一个十六进制数,因此我们将以16为底进
我有一个外国金融机构签名,我需要执行: FFI调用者需要提供一个缓冲区和该缓冲区的大小。Rust将向该缓冲区中填充一个字符串,最大值为,如果成功,则返回。FFI调用方应将字符串解释为ASCII。 鉴于我有一个
我得到一个空指针异常在我的code.Please帮我解决它。这是我的代码。 这是我的原木猫。 第138行为点击法-
问题内容: 如何将类型中的字符串指针的引用值设置为空字符串?考虑以下示例: 我尝试了和运算符的所有组合都无济于事: 显然其中一些很愚蠢,但我没有发现尝试的危害。我也尝试使用和: 这会导致编译错误 恐慌:反映:使用不可寻址的值reflect.Value.SetString 我假设这是因为Go中的字符串是不可变的? 问题答案: 字符串文字不可寻址。 取包含空字符串的变量的地址: 或使用新的:
我要做的是将值存储在元素strucz数组中(该数组有一个成员void*data) 我已经把数组拼成了3个元素 我知道如果数据是int,你可以这样做,但是如果数据是空的,你怎么做呢* 我试过打字 但我得到消息预期表达式之前'in' 我的第二个问题是如何在元素结构中存储字符串(我不能使另一个成员成为字符串,它必须使用void指针) 我可以用strcopy或sscanf吗? 下面的主要样本,以防我做错了