go - 为什么kubernetes内部使用字符串指针而不是字符串?

标签 go

不仅是字符串指针,还有bool指针、int指针等

参见: https://github.com/kubernetes/cli-runtime/blob/5c4694c3aa38d6f710b2e3b18598f9d83f1aae3b/pkg/genericclioptions/config_flags.go#L322-L336

golang 似乎无法从 Constant Pool 之类的东西中获益。

语言

package main

import (
    "fmt"
)

func StringPtr(s string) *string {
    return &s
}

func main() {
    fmt.Println(StringPtr("")) // outputs "0x40e128"
    fmt.Println(StringPtr("")) // outputs "0x40e138"
}

python

id("") // outputs "4459080368"
id("") // outputs "4459080368"

最佳答案

我的猜测是这样做是为了确保配置标志的值在更改时随处更新。

这个例子可能会有帮助

package main

import "fmt"

func stringPointer(s string) *string {
    return &s
}

type Config struct {
    String  string
    Pointer *string
}

func NewConfig() Config {
    return Config{
        String:  "default",
        Pointer: stringPointer("default"),
    }
}

var (
    config = NewConfig()

    String  = config.String
    Pointer = config.Pointer
)

func PrintVars() {
    fmt.Printf("config.String: %v\n", config.String)
    fmt.Printf("config.Pointer: %v\n", *config.Pointer)
    fmt.Printf("String: %v\n", String)
    fmt.Printf("Pointer: %v\n", *Pointer)
    fmt.Println("-------------------------")
}

func main() {
    PrintVars()
    config.String = "new value"
    *config.Pointer = "new value"
    PrintVars()
    String = "even newer value"
    *Pointer = "even newer value"
    PrintVars()
}

输出:

config.String: default
config.Pointer: default
String: default
Pointer: default
-------------------------
config.String: new value
config.Pointer: new value
String: default
Pointer: new value
-------------------------
config.String: new value
config.Pointer: even newer value
String: even newer value
Pointer: even newer value
-------------------------

关于go - 为什么kubernetes内部使用字符串指针而不是字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54823690/

相关文章:

struct - 在已经类型化的结构上进行 Go 结构类型

Go 类型推断和命名返回变量

postgresql - 数据库连接在Golang中出错了吗?

golang 在死锁检测中有奇怪的行为

mongodb - 在Go中删除MongoDB中的数组元素

Go并发访问指针方法

debugging - 调试golang程序时如何检查GoLand中的全局变量?

go - 给新手的建议

datetime - 如何解析自定义日期时间字符串

go - MarshalJSON 一个字符串声明类型