Golang指针字符串值

Pum*_*eed 1 flags pointers go

一些代码我使用标志来管理程序或服务.今天我遇到了问题,我想使用这种声明:

var port = flag.String("port", "", "port")
Run Code Online (Sandbox Code Playgroud)

它返回一个*string我无法转换为的类型变量string.我是如何解决问题的:

r.Run(":" + *port)
Run Code Online (Sandbox Code Playgroud)

这是有效的,但最佳做法是什么?我的意思是有一些函数正在等待字符串作为参数,在这种情况下我无法处理.

icz*_*cza 9

你的port变量是类型的*string(这是flag.String()返回的).要获得类型的值,string除了取消引用它之外别无他法:*port.

你可以在你需要传递它的每个地方这样做string,或者你可以使用flag.StringVar():

var port string

func init() {
    flag.StringVar(&port, "port", "", "port")
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您的port变量是类型string,因此不需要解除引用.在这里,您明确地为要使用*stringflag包提供一个值:类型变量的地址,当然string是类型*string的变量(因此flag包可以修改/设置指向的值).这flag.String()是一个便捷函数,它分配一个string值并返回指向它的指针.

另一种选择是取消引用它一次并将string值存储在另一个类型的变量中string,例如:

var portp = flag.String("port", "", "port")
var port string

func main() {
    flag.Parse()
    port = *portp
    // Now you can use port which is of type string
}
Run Code Online (Sandbox Code Playgroud)

但我更喜欢这个flag.StringVar()解决方案.

请注意,无论端口是数字,您最好使用flag.Int()flag.IntVar():

var port int

func init() {
    flag.IntVar(&port, "port", 0, "port")
}
Run Code Online (Sandbox Code Playgroud)