pointers - Golang 指向值的指针字符串

标签 pointers go flags

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

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/

相关文章:

go - 在 golang 中扩展包结构

android - 锁定/解锁方向

c++ - QT Creator 中没有警告

c - 如何制作结构数组

html - Golang html 模板索引

c++ - 用于创建对象数组的双指针(访问冲突读取位置 0xcdcdcdd1)

go - 将 CIDR block 转换为 net.IP 类型

java - 在运行时移除 FLAG_TRANSLUCENT_STATUS

python - ctypes:将指向 char 的指针分解/转换为指向 char 的指针数组

c++ - int* 参数是否与 int[] 参数完全相同