Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String *字符串和Golang中的字符串有什么区别?_String_Go - Fatal编程技术网

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
    以及传递的实际类型和值)

  • 很少使用指向字符串的指针。Go中的字符串是不可变的(),因此在类似于
    flag.string
    的情况下,如果您需要返回一个稍后将发生变异的字符串,则必须返回一个指向字符串的指针。但在惯用的围棋中,你不会经常看到这种情况

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

    var s string
    s = username
    

  • 这将引发编译器错误。

    用*表示的变量是指针,或内存中的地址(将其视为一个邮寄地址,其中变量是一所房子)。有关更多信息,请参阅。