Nik Kunkel
Nik Kunkel

Reputation: 355

How to pass function handle with arguments to another function in Go?

I created a scheduler() function which will execute a passed function on an interval.

func scheduler(what func(), delay time.Duration) {
   fmt.Printf("Starting scheduled process on interval %d\n", delay)
   ticker := time.NewTicker(delay)
   quit := make(chan bool, 1)
   go func() {
      for {
         select {
           case <- ticker.C:
               what()
           case <- quit:
               ticker.Stop()
               return
         }
      }
   }()
   <-quit
}

Scheduling the following ping function works perfectly.

func ping() {
   fmt.Printf("Tick\n")
}

func main() {
   scheduler(ping, time.Second)
}

However if I change ping to include an argument as so:

func ping(msg string) {
    fmt.Printf ("%s\n", msg)
} 
func main() {
  scheduler(ping("Hello"), time.Second)
}

I get the compile error:

ping("Hi") used as value

How do I pass this function with arguments without passing it as the return value? I would like to keep the scheduler() function generic enough that I can use other functions that have different argument signatures.

Upvotes: 1

Views: 2764

Answers (1)

Jonathan Hall
Jonathan Hall

Reputation: 79584

Use an anonymous function which calls your underlying function:

func main() {
    scheduler(func() {
        ping("Hello")
    }, time.Second)
}

This allows calling arbitrarily complex functions, or even using closures:

db := // connect to a DB
scheduler(func() {
    ping(db, "Hello") // Or any other arbitrary complexity
}, time.Second)

Upvotes: 6

Related Questions