package main
import (
"fmt"
)
func main(){
var str string = "hello,world"
fmt.Println(&str)
fmt.Println(&str[0])
}
我是golang的新手。刚开始学习一些 天。这是我的问题:
编译错误:不能取str [0]的地址
我搜索了<>,它说你不能接受 字符串中字符的地址,但我想知道为什么不允许这样做 做这个?另一个困惑是,一旦你创建了一个字符串,你 不能再修改它,这是否意味着字符串是恒定的 空间?
答案 0 :(得分:3)
是的,这在Go Documentation中是正确的,你可以看到
字符串类型表示字符串值的集合。字符串值是a (可能是空的)字节序列。字符串是不可变的:一次 创建后,无法更改字符串的内容。该 预先声明的字符串类型是字符串。
可以使用发现字符串s的长度(以字节为单位的大小) 内置函数len。如果长度是编译时常量 字符串是常量。字符串的字节可以通过整数访问 索引0到len(s)-1。取这样的地址是违法的 元素;如果s [i]是字符串的第i个字节,则& s [i]无效。
我希望这能解决你的疑虑
答案 1 :(得分:0)
为了澄清此问题的未来访问者的答案,访问像s := "stack overflow"
fmt.Println(&s) // works
fmt.Println(&"hello, world") // runtime error
这样的字符串的第i个字节的地址是无效的,因为字符串是不可变的。如果你能得到地址,那么字符串可以变异。
同样的逻辑适用于文字字符串。
&42
这可能看起来很奇怪,但如果你认为它是一个常数,那就更有意义了。为了保持一致性,必须允许获取其他常量的地址,例如&true
或public static class DateTimeExtensions
{
public static DateTime AddHalfMonth(this DateTime dt)
{
int daysInMonth = System.DateTime.DaysInMonth(dt.Year, dt.Month);
if (daysInMonth % 2 == 0 || dt.Day < daysInMonth / 2)
{
return dt.AddDays(daysInMonth / 2);
}
return dt.AddDays((daysInMonth + 1) / 2);
}
}
。