1

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.

1 Answer 1

6

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)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.