Once you've done that same "make a low-tech simple replacement" for all of sleep, context deadlines, tickers, AfterFuncs, etc all of which are quite commonly used... you've basically done everything these libraries do. At about the same level of complexity.
type NowFunc func() time.Time
func getGreeting(nowFunc NowFunc) string {
}And just pass in `time.Now` in for live code, and your own inline function for simulating a time in tests.