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

目的:理解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:=*username

fmt.Printf("Your username is %q.", bla)

它能够再次打印字符串:


Your username is "root".Your username is %!q(*string=0xc8200781f0).Your username is "root".

问题

  1. 为什么是 *string != string,例如 display of: "root"vs. %!q(*string=0xc8200781f0)

  2. 在哪些其他情况下应该使用 *string 而不是字符串,为什么?

  3. 为什么可以将 *string 分配给字符串变量,而字符串的显示却不同,例如 display of: "root"vs. %!q(*string=0xc8200781f0)


ABOUTYOU
浏览 2687回答 1
1回答

慕娘9325324

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给 a string。尝试删除该*行上的 ,您将看到编译器错误消息。(实际上,因为您使用的是短变量声明符号,所以:=您不会看到编译器错误,但您的变量将被声明为指向字符串的指针。试试这个,以更好地了解发生了什么:var s string s = username这将引发编译器错误)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go