我已经开始研究Golang,并通过一个传递命令行参数的示例,我得到了以下代码:

package main

import (
    "flag"
    "fmt"
)

func main() {

    wordPtr := flag.String("namestring", "stringvalue", "Pass in a string")
    numPtr := flag.Int("number", 11, "Pass in an int")
    boolPtr := flag.Bool("switchflag", false, "Pass in a bool")
    var svar string
    flag.StringVar(&svar, "svar", "svarstringvalue", "A string variable")
    flag.Parse()

    fmt.Println("Word:", *wordPtr)
    fmt.Println("Word2:", wordPtr)
    fmt.Println("numb:", *numPtr)
    fmt.Println("numb2", numPtr)
    fmt.Println("switchflag", *boolPtr)
    fmt.Println("switchflag2", boolPtr)
    fmt.Println("svar:", svar)
    fmt.Println("svar2", &svar)
    fmt.Println("svar3", *svar) //<-- This won't work...
    fmt.Println("tail:", flag.Args())

}

我的问题是,如果我取消引用其他指针的值(例如*wordPtr等),为什么要获得其他指针的值,而如果我将wordPtr传入,则可以获得内存地址,但是对于svar,我必须传递svar来获取值,并且&svar获取我的内存地址?

https://golang.org/pkg/flag/上查看文档,它说您传入一个变量来存储标志(大概是已经创建的变量?),但是我仍然不明白为什么我必须对其做一些不同的事情才能获得值与其他变量相比。

这是我通过传递一些命令来运行它的结果:
➜  Documents go run main.go -number 42 -switchflag -svar testtringvalue
Word: stringvalue
Word2: 0xc42005c1e0
numb: 42
numb2 0xc4200160a0
switchflag true
switchflag2 0xc4200160a8
svar: testtringvalue
svar2 0xc42005c1f0
tail: []

任何帮助表示赞赏。另外,如果我对它有任何误解,请告诉我。

干杯。

最佳答案

好吧,这很简单,您正在尝试取消引用值而不是指针。
var svar string不是指针,而是一个值。
fmt.Println("svar3", svar)在这种情况下是正确使用

不用担心使用StringVar作为...Var(&svar, "sv...表示您正在传递svar的地址而不是值。

10-07 18:27