1 回答
TA贡献1783条经验 获得超4个赞
A*string
是指向字符串的指针。如果您不熟悉指针,我们就说它是一个保存另一个值地址的值,而不是值本身(这是一个间接级别)。
当*
在一个类型时,它表示一个指针,它指向类型。*int
是一个指向整数的指针。***bool
是一个指向指向 bool 的指针的指针。
flag.String
返回一个指向字符串的指针,因为它随后可以修改字符串值(在调用 之后flag.Parse
),并且您可以使用解引用运算符检索该值 - 也就是说,当*
在变量上使用时,它会解引用它,或检索指向的值而不是变量本身的值(在指针的情况下,它只是一个内存地址)。
因此,要回答您的具体问题:
包中的
%q
动词fmt
理解字符串(和字节片),而不是指针,因此显示出明显的胡言乱语(当值不是匹配动词的预期类型时 - 此处%q
-fmt
函数%!q
与实际类型和传递的值一起显示)很少使用指向字符串的指针。Go 中的字符串是不可变的(https://golang.org/ref/spec#String_types),因此在
flag.String
需要返回稍后将发生变异的字符串的情况下,您必须返回指向字符串的指针。但是在惯用的围棋中你不会经常看到这种情况。您没有将
*string
(指向字符串的指针)分配给string
. 你在做什么,因为我前面提到的,被取消引用的*string
变量,提取其string
价值。因此,您实际上是将 a 分配string
给 astring
。尝试删除该*
行上的 ,您将看到编译器错误消息。(实际上,因为您使用的是短变量声明符号,所以:=
您不会看到编译器错误,但您的变量将被声明为指向字符串的指针。试试这个,以更好地了解发生了什么:var s string s = username
这将引发编译器错误)。
- 1 回答
- 0 关注
- 2686 浏览
添加回答
举报