#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
.