В Go, если у нас есть тип с методом, который запускает некоторый циклический механизм (опрос A и ведение B навсегда), лучше всего выразить это как:
// Run does stuff, you probably want to run this as a goroutine
func (t Type) Run() {
// Do long-running stuff
}
и документируйте, что это, вероятно, хочет быть запущено как goroutine (и пусть вызывающий абонент справляется с этим)
Или, чтобы скрыть это от вызывающего:
// Run does stuff concurrently
func (t Type) Run() {
go DoRunStuff()
}
Я новичок в Go и не уверен, что если соглашение говорит, пусть префикс вызывающего абонента имеет "go" или делает это для них, когда код предназначен для запуска async.
Мое текущее мнение заключается в том, что мы должны документировать и предоставлять вызывающему абоненту выбор. Я думаю, что в Go concurrency на самом деле не часть открытого интерфейса, а свойство его использования. Правильно ли это?