String *字符串和Golang中的字符串有什么区别?
目标:了解歌朗中String *字符串和Golang中的字符串有什么区别?,string,go,String,Go,目标:了解歌朗中*string和string之间的区别 尝试 func passArguments() { username := flag.String("user", "root", "Username for this server") flag.Parse() fmt.Printf("Your username is %q.", *username) fmt.Printf("Your username is %q.", username) } 结果:
*string
和string
之间的区别
尝试
func passArguments() {
username := flag.String("user", "root", "Username for this server")
flag.Parse()
fmt.Printf("Your username is %q.", *username)
fmt.Printf("Your username is %q.", username)
}
结果:
Your username is "root".Your username is %!q(*string=0xc820072200)
但当*字符串被分配给字符串时:
bla:=*username
fmt.Printf("Your username is %q.", bla)
它可以再次打印字符串:
Your username is "root".Your username is %!q(*string=0xc8200781f0).Your username is "root".
问题
“根”
vs。
%!q(*字符串=0xc8200781f0)
李>
“root”
vs。
%!q(*字符串=0xc8200781f0)
*字符串
是指向字符串的指针。如果您不熟悉指针,我们就说它是一个保存另一个值的地址的值,而不是值本身(它是一个间接级别)
当类型中使用*
时,它表示指向该类型的指针*int
是指向整数的指针<代码>***bool是指向bool的指针
flag.String
返回指向字符串的指针,因为它可以修改字符串值(在调用flag.Parse
之后),并且您可以使用解引用运算符检索该值-也就是说,当对变量使用*
时,它会解引用该值,或检索指向的值,而不是变量本身的值(在指针的情况下,变量本身只是一个内存地址)
因此,要回答您的具体问题:
fmt
包中的%q
动词理解字符串(和字节片),而不是指针,因此会显示明显的乱码(当值不是匹配动词的预期类型时-此处%q
,fmt
函数显示%!q
以及传递的实际类型和值)flag.string
的情况下,如果您需要返回一个稍后将发生变异的字符串,则必须返回一个指向字符串的指针。但在惯用的围棋中,你不会经常看到这种情况*字符串
(指向字符串的指针)分配给字符串
。正如我前面提到的,您所做的是取消引用*string
变量,提取其string
值。因此,实际上您正在将字符串
分配给字符串
。尝试删除该行上的*
,您将看到编译器错误消息。(实际上,由于您使用的是短变量声明符号,:=
,因此不会看到编译器错误,但您的变量将声明为指向字符串的指针。请尝试以下操作,以更好地了解发生了什么:
var s string
s = username
这将引发编译器错误。用*表示的变量是指针,或内存中的地址(将其视为一个邮寄地址,其中变量是一所房子)。有关更多信息,请参阅。