一些代码我使用标志来管理程序或服务.今天我遇到了问题,我想使用这种声明:
var port = flag.String("port", "", "port")
Run Code Online (Sandbox Code Playgroud)
它返回一个*string我无法转换为的类型变量string.我是如何解决问题的:
r.Run(":" + *port)
Run Code Online (Sandbox Code Playgroud)
这是有效的,但最佳做法是什么?我的意思是有一些函数正在等待字符串作为参数,在这种情况下我无法处理.
你的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,因此不需要解除引用.在这里,您明确地为要使用*string的flag包提供一个值:类型变量的地址,当然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)