Golang 指向值的指针字符串

Golang pointer string to value

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

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

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

r.Run(":" + *port)

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

您的 port 变量是 *string 类型(这就是 flag.String() returns)。要获取 string 类型的值,除了取消引用它别无他法:*port.

您可以在每个需要将其作为 string 传递的地方这样做,或者您可以使用 flag.StringVar() 代替:

var port string

func init() {
    flag.StringVar(&port, "port", "", "port")
}

在这种情况下,您的 port 变量是 string 类型,因此不需要取消引用。在这里,您明确地向要使用的 flag 包提供了一个 *string 值:您的 string 类型变量的地址,它当然是 *string 类型(所以flag 包将能够修改/设置指向的值)。 flag.String() 是一个方便的函数,它分配一个 string 值和 returns 你指向它的指针。

另一种选择是取消引用它一次并将 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() or flag.IntVar():

var port int

func init() {
    flag.IntVar(&port, "port", 0, "port")
}

您应该能够按原样使用它或将其转换为字符串。

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)

}