как создать параметр функции, который не будет скопирован и не может быть нулевым

#go

#Вперед

Вопрос:

Возможно ли в golang создать функцию, которая принимает структуру со следующими ограничениями:

  • структура не должна копироваться (она относительно большая)
  • вызывающий объект не должен иметь возможности передавать nil

РЕДАКТИРОВАТЬ: Я пробовал использовать указатели, но для них можно установить значение null. Я не могу найти ни одной хорошей статьи о том, как использовать ссылки, и не похоже, что я могу передавать по ссылке.

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

1. Нет. Но это слишком короткий ответ.

Ответ №1:

Вы можете создать оболочку tiny struct, которая содержит частный указатель на большую структуру и определяет Get метод, позволяющий получить доступ к этой большой структуре. Внутри Get вы проверяете, равен ли указатель нулю, тогда он паникует.

Что-то вроде:

 type StructHolder struct {
    target *BigStruct
}

func (s StructHolder) Get() *BigStruct {
    if s.target == nil {
        panic("target is nil")
    }

    return s.target
}
  

Зачем вам это делать? Я бы подумал, что лучше передать указатель и проверить его значение.

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

1. вот что я в итоге сделал. Я просто не хотел еще одну проверку в моей функции, потому что ее уже трудно прочитать.