亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么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 關注
  • 229 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號