I think Seth's correct. https://go-review.googlesource.com/c/go/+/248817/ will unintentionally fix some of the cases of this issue. I think that CL also doesn't completely address what it intended to address. I'll see about putting something together to fix this completely.
shortestIdleTimeLocked is used as a interval of connectionCleanerRunLocked.
connectionCleanerRunLocked should run every timing of expire can be occured, so interval should be min(maxIdleTime, maxLifeTime).