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

时间:2019-02-22 09:16:10

标签: go

不仅是字符串指针,而且还有布尔指针,整数指针等。

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

golang似乎无法从Constant Pool等中获得好处。

Golang

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"

4 个答案:

答案 0 :(得分:1)

我的猜测是,通过这种方式可以确保配置标志的值在更改后到处都可以更新。

此示例可能会有所帮助

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
-------------------------

答案 1 :(得分:1)

通常,在config(如kubernetes spec)中使用int指针代替int的目的是为了区分显式零和未指定,同字符串 或布尔值。您可以在 https://book.kubebuilder.io/cronjob-tutorial/api-design.html

中找到它

答案 2 :(得分:0)

要存储字符串,您需要2个字的计算机内存。其中一个指向字符串的开头,另一个包含长度。

字符串指针只是大小的一半,因为它只是一个指针,没有长度。这样可以节省内存。

当您有100个指向同一字符串的指针时,这种区别变得明显。这样您就有了100 + 2个字加上实际的字节数组。当然,这取决于newstring是否对字符串进行实习。

使用字符串指针而不是字符串还有另一个用例。然后,程序可以区分空字符串和根本没有字符串。特别是在配置部分,这很有用。超时为0秒与完全没有超时不同。对于大多数其他配置选项,无论如何,空字符串将毫无意义,因此这只是开销。尽管如此,它还是以此方式构造的,以使每个配置选项具有相同的结构。当您需要了解代码时,这种一致性会有所帮助。

还有其他原因。也许有一些有关此主题的项目文档。

答案 3 :(得分:0)

属性指针为属性赋予另一个值:

type config struct {
   PtrValue *string
   Value    string
}

基本类型变量的指针非常适合空字符串("")nil值具有不同含义的情况。

例如,命令行程序的输入参数不能保证用户提供了这种输入。指针值是区分无输入和零值输入的理想方法。