Задать вопрос
@Ciscoridze

Golang. Почему в коде переменной присваивается ссылка на структуру?

Помогите разобраться, почему в функции Get переменной result присваивается именно &v1.Pod{}. Что это значит?
Речь не про конкретную функцию, она лишь является примером. Я видел подобный код ни раз и этот вопрос всплывал ранее и в других случаях.
Я понимаю, что это ссылка на структуру Pod (она приложена ниже в тексте вопроса просто для понимания).
Но что такой способ присваивания и последующего возврата нам дает?
В указателях я немного разобрался, и мне понятно, допустим, следующее:
var a = 10
var b = &a
fmt.Println(*b) выведет 10
*b=*b+10
fmt.Println(a) выведет 20


Я бы понял, если бы было как-то так:
var someVariable v1.Pod 
result = &someVariable

Но я данном случае непотно, что подразумевается под result = &v1.Pod{}
Почему, допустим, переменная result не присваивается просто v1.Pod{} и после возвращается? Почему именно так, как написано?

func (c *pods) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.Pod, err error) {
	result = &v1.Pod{}
	err = c.client.Get().
		Namespace(c.ns).
		Resource("pods").
		Name(name).
		VersionedParams(&options, scheme.ParameterCodec).
		Do(ctx).
		Into(result)
	return
}


type Pod struct {
    metav1.TypeMeta `json:",inline"`
    // Standard object's metadata.
    // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
    // +optional
    metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
    // Specification of the desired behavior of the pod.
    // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
    // +optional
    Spec PodSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
    // Most recently observed status of the pod.
    // This data may not be up to date.
    // Populated by the system.
    // Read-only.
    // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
    // +optional
    Status PodStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
}
Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts.

v1.Pod on pkg.go.dev
  • Вопрос задан
  • 210 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@FedorWK
Структуры в Го передаются по дефолту по значению, то есть передается копия экземпляра. В данном случае было принято решение возвращать указатель на структуру (result *v1.Pod), чтобы избежать копирования (либо потому, что так принято). См. сигнатуру функции:
func (c *pods) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.Pod, err error)

Поскольку по сигнатуре мы должны вернуть указатель на структуру, мы берем ее адрес (&v1.Pod{}), а не значение структуры (v1.Pod{}).

Подобный вопрос на SO
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы