Что означают две звезды перед оператором switch

#go #pointers

#Вперед #указатели

Вопрос:

Я изучаю существующую кодовую базу go и вижу такой код

         switch v := value.(type) {
        case **model.User:
             // do something
        case **model.Session:
            // do something
        }
  

Что ** означает перед каждой проверкой типа. Означает ли это указатель на указатель? у меня кружится голова, или есть что-то более простое?

Ответ №1:

A * в Go — это указатель. В этом нет ничего особенного ** , это просто означает указатель на указатель.

Это проверка, является ли value одним из:

  • указатель на указатель на model.User
  • указатель на указатель на model.Session

Передача a *x в функцию является довольно стандартной, когда функцию необходимо изменить x . В этом случае x это одно из *model.User или *model.Session .

Комментарии:

1. существует ли какой-либо конкретный сценарий, по которому кто-то мог бы написать подобный код, исходя из языка без указателей, я бы сказал, что это ненужная сложность и плохой код

2. Это зависит от того, как value передается. Например, это может быть такой способ передачи в качестве аргумента и позволить функции изменять базовый указатель. Вам придется обсудить это с авторами.

3. спасибо за это, я думаю, что это изменяет указатель. Это какой-то шаблон?

4. Передача *x функции, которую необходимо изменить x , довольно стандартна в языках указателей, да.

5. То же самое, передача **x является стандартной, если функцию необходимо изменить *x .