获取字符串

时间:2016-12-02 06:56:11

标签: go

package main
import (
    "fmt"
)
func main(){
    var str string = "hello,world"
    fmt.Println(&str)
    fmt.Println(&str[0])
}

我是golang的新手。刚开始学习一些 天。这是我的问题:

  

编译错误:不能取str [0]的地址

我搜索了<>,它说你不能接受 字符串中字符的地址,但我想知道为什么不允许这样做 做这个?另一个困惑是,一旦你创建了一个字符串,你 不能再修改它,这是否意味着字符串是恒定的 空间?

2 个答案:

答案 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

这可能看起来很奇怪,但如果你认为它是一个常数,那就更有意义了。为了保持一致性,必须允许获取其他常量的地址,例如&truepublic 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); } }