我正在使用标志来管理程序或服务。今天我遇到了问题,我想使用这种声明:
var port = flag.String("port", "", "port")
返回*string
类型变量,我无法将其转换为string
。
我是如何解决这个问题的:
r.Run(":" + *port)
这是有效的,但最佳做法是什么?我的意思是有一些函数正在等待字符串作为参数,在这种情况下我无法处理它。
答案 0 :(得分:7)
您的port
变量属于*string
类型(这是flag.String()
返回的内容)。要获得string
类型的值,除了取消引用它之外别无其他:*port
。
您可以在需要将其作为string
传递的每个地方执行此操作,或者您可以使用flag.StringVar()
代替:
var port string
func init() {
flag.StringVar(&port, "port", "", "port")
}
在这种情况下,您的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
}
但我更喜欢flag.StringVar()
解决方案。
请注意,无论端口是一个数字,您最好使用flag.Int()
或flag.IntVar()
:
var port int
func init() {
flag.IntVar(&port, "port", 0, "port")
}
答案 1 :(得分:0)
您应该可以按原样使用它,或者只是将其转换为字符串。
package main
import "fmt"
import "flag"
func main () {
var port = flag.String("port", "", "port")
flag.Parse()
test(*port)
newstring := *port
test(newstring)
}
func test (s string) {
fmt.Println(s)
}