一些代码我使用标志来管理程序或服务。今天我遇到了问题,我想在哪里使用这种声明:
var port = flag.String("port", "", "port")
它返回一个 *string
类型的变量,我无法将其转换为 string
。
我是如何解决这个问题的:
r.Run(":" + *port)
它正在运行,但最佳实践是什么?我的意思是有很多函数正在等待字符串作为参数,在这种情况下我无法处理。
最佳答案
您的port
变量是*string
类型(这是flag.String()
返回的)。要获取 string
类型的值,除了取消引用它别无他法:*port
。
您可以在任何需要将其作为字符串
传递的地方这样做,或者您可以使用flag.StringVar()
。相反:
var port string
func init() {
flag.StringVar(&port, "port", "", "port")
}
在这种情况下,您的port
变量是string
类型,因此不需要取消引用。在这里,您显式地为要使用的 flag
包提供了一个 *string
值:您的 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
}
但我更喜欢flag.StringVar()
解决方案。
请注意,无论端口是一个数字,您最好还是使用 flag.Int()
或 flag.IntVar()
:
var port int
func init() {
flag.IntVar(&port, "port", 0, "port")
}
关于pointers - Golang 指向值的指针字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40152220/