Почему kubernetes внутренне использует строковые указатели, а не строки? - PullRequest
0 голосов
/ 22 февраля 2019

Не только строковые указатели, но и 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"
}

Питон

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

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Полагаю, это сделано таким образом, чтобы быть уверенным, что значения флагов конфигурации обновляются везде, если они были изменены.

Этот пример может быть полезен

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()
}

out:

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
-------------------------
0 голосов
/ 22 февраля 2019

Указатель атрибута дает атрибуту другое значение:

type config struct {
   PtrValue *string
   Value    string
}

Указатели на переменные базового типа отлично подходят для случаев, когда пустая строка ("") будет иметь значение, отличное от значения nil.

Например, входные аргументы программы командной строки не гарантируют, что пользователь предоставит такой ввод.Значение указателя является идеальным способом отличить ввод от нулевого значения и ввод нулевого значения.

0 голосов
/ 22 февраля 2019

Чтобы сохранить строку, вам нужно 2 слова памяти компьютера.Один из них указывает на начало строки, другой содержит длину.

Строковый указатель составляет только половину размера, поскольку это просто указатель без длины.Это экономит память.

Когда у вас есть 100 указателей на одну строку, эта разница становится очевидной.Тогда у вас есть 100 + 2 слова плюс фактический байтовый массив.Это, конечно, зависит от того, интернирует ли newstring строки.

Использование строковых указателей вместо строк имеет другой вариант использования.Затем программа может различать пустую строку и отсутствие строки вообще.Особенно в разделе конфигурации, это полезно.Время ожидания 0 секунд отличается от отсутствия времени ожидания вообще.Для большинства других параметров конфигурации пустая строка не имеет смысла, так что это просто накладные расходы.Тем не менее, он структурирован таким образом, чтобы иметь одинаковую структуру для каждого параметра конфигурации.Эта согласованность помогает, когда вам нужно понять код.

Могут быть и другие причины.Может быть, есть немного проектной документации по этой теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...