为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
富国沪深 2023-06-12 09:24:54
不仅是字符串指针,还有bool指针、int指针等。请参阅: https: //github.com/kubernetes/cli-runtime/blob/5c4694c3aa38d6f710b2e3b18598f9d83f1aae3b/pkg/genericcloptions/config_flags.go#L322-L336似乎 golang 无法从 Constant Pool 之类的东西中获益。戈朗package mainimport (    "fmt")func StringPtr(s string) *string {    return &s}func main() {    fmt.Println(StringPtr("")) // outputs "0x40e128"    fmt.Println(StringPtr("")) // outputs "0x40e138"}Pythonid("") // outputs "4459080368"id("") // outputs "4459080368"
查看完整描述

4 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

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


这个例子可能有帮助


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

-------------------------


查看完整回答
反对 回复 2023-06-12
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

通常,在配置中使用 int 指针而不是 int 的目的(如 kubernetes spec)是为了区分显式零和未指定,与 string 或 bool 相同。


查看完整回答
反对 回复 2023-06-12
?
心有法竹

TA贡献1866条经验 获得超5个赞

属性指针为属性提供另一个值:

type config struct {
   PtrValue *string
   Value    string
   }

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

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


查看完整回答
反对 回复 2023-06-12
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

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

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

当您有 100 个指向同一个字符串的指针时,这种差异就会变得很明显。然后你有 100 + 2 个单词加上实际的字节数组。这当然取决于是否newstring实习字符串。

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

也可能有其他原因。也许有一些关于这个主题的项目文档。


查看完整回答
反对 回复 2023-06-12
  • 4 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信