В вашей реализации надпись "I am doing this!" будет показана только один раз, т.к. вы пишите всего 1 раз в канал, а потом выполнение заблокируется на чтении данных из канала, т.к. там данных не будет.
То, что вы хотите сделать можно сделать вот так:
package main
import (
"log"
"time"
)
func doSomethingEvery5Seconds(ch chan bool) {
log.Println("Started!")
for {
select {
case <-ch:
return
default:
log.Println("I am doing this!")
time.Sleep(1 * time.Second)
}
}
}
func main() {
ch := make(chan bool, 1)
go doSomethingEvery5Seconds(ch)
time.Sleep(15 * time.Second)
close(ch) // Останавливаем спустя 15 секунд
}