为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 中的 *string 和 string 有什么区别?

Golang 中的 *string 和 string 有什么区别?

Go
ABOUTYOU 2021-11-22 16:13:24
目的:理解Golang*string和stringGolang之间的区别试图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)但是当 *string 被分配给一个字符串时:bla:=*usernamefmt.Printf("Your username is %q.", bla)它能够再次打印字符串:Your username is "root".Your username is %!q(*string=0xc8200781f0).Your username is "root".问题为什么是 *string != string,例如 display of: "root"vs. %!q(*string=0xc8200781f0)?在哪些其他情况下应该使用 *string 而不是字符串,为什么?为什么可以将 *string 分配给字符串变量,而字符串的显示却不同,例如 display of: "root"vs. %!q(*string=0xc8200781f0)?
查看完整描述

1 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

A*string是指向字符串的指针。如果您不熟悉指针,我们就说它是一个保存另一个值地址的值,而不是值本身(这是一个间接级别)。

*在一个类型时,它表示一个指针,它指向类型。*int是一个指向整数的指针。***bool是一个指向指向 bool 的指针的指针。

flag.String返回一个指向字符串的指针,因为它随后可以修改字符串值(在调用 之后flag.Parse),并且您可以使用解引用运算符检索该值 - 也就是说,当*在变量上使用时,它会解引用它,或检索指向的值而不是变量本身的值(在指针的情况下,它只是一个内存地址)。

因此,要回答您的具体问题:

  1. 包中的%q动词fmt理解字符串(和字节片),而不是指针,因此显示出明显的胡言乱语(当值不是匹配动词的预期类型时 - 此处%q-fmt函数%!q与实际类型和传递的值一起显示)

  2. 很少使用指向字符串的指针。Go 中的字符串是不可变的(https://golang.org/ref/spec#String_types),因此在flag.String需要返回稍后将发生变异的字符串的情况下,您必须返回指向字符串的指针。但是在惯用的围棋中你不会经常看到这种情况。

  3. 您没有将*string(指向字符串的指针)分配给string. 你在做什么,因为我前面提到的,被取消引用*string变量,提取其string价值。因此,您实际上是将 a 分配string给 a string。尝试删除该*行上的 ,您将看到编译器错误消息。(实际上,因为您使用的是短变量声明符号,所以:=您不会看到编译器错误,但您的变量将被声明为指向字符串的指针。试试这个,以更好地了解发生了什么:

    var s string
    s = username

这将引发编译器错误)。


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 2686 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信