Golang指针字符串值

时间:2016-10-20 10:45:02

标签: pointers go flags

我正在使用标志来管理程序或服务。今天我遇到了问题,我想使用这种声明:

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

返回*string类型变量,我无法将其转换为string。 我是如何解决这个问题的:

r.Run(":" + *port)

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

2 个答案:

答案 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)

}