Полезность любого типа данных зависит от решаемой проблемы и метода, используемого для ее решения.Если тип данных не подходит к проблеме, он просто не подходит к проблеме - и в ней больше ничего нет.
Язык программирования Go (как и большинство других языков программирования) основан на простые правила, которые программист может использовать для создания новых типов данных.Вот некоторые из этих правил:
*T
: создать новый тип данных, который является указателем на T [10]T
: массив Ts struct { t T; u U ... }
: структура, которая содержит T в качестве компонента - ...
Программист может создавать сложные типы данных, составляя эти простые правила.Общее количество возможных типов данных превышает количество полезных типов данных.Ясно, что существуют (и должны существовать) типы данных, которые вообще бесполезны.Это просто естественное следствие того, что правила для создания новых типов данных просты.
Тип **T
попадает в категорию типов, которые с меньшей вероятностью появляются в программе.Тот факт, что можно написать *****T
, не означает, что такой тип должен быть чрезвычайно полезным.
И, наконец, ответ на ваш вопрос :
Тип **T
обычно появляется в контекстах, где мы хотим перенаправить пользователей значения типа T
на другое значение типа T
, но по какой-то причине у нас нет доступа ко всем пользователямзначение или поиск пользователей будет стоить слишком много времени:
- Мы не хотим копировать значения типа
T
(по некоторым причинам) - Мы хотим, чтобы все пользователизначение типа
T
для доступа к значению через указатель - Мы хотим быстро перенаправить всех пользователей определенного значения типа
T
на другое значение
В такой ситуации использование **T
является естественным, поскольку позволяет реализовать третий шаг в O (1):
type User_of_T struct {
Value **T
}
// Redirect all users of a particular value of type T
// to another value of type T.
func (u *User_of_T) Redirect(t *T) {
*(u.Value) = t
}