TL;DR: Syntax for using anonymous function in Go defer statement

defer func() {
      // do something here after surrounding function returns


I want to execute c <- 1 right after surrounding function returns. In the beginning I thought it was easy to do this with defer, so I write the following code:

defer c <- 1

But the code cannot be compiled successfully. The compiler complained that expression in defer must be function call. So I searched and found this on A Tour of Go:

A defer statement defers the execution of a function until the surrounding function returns.

It looks like defer must be followed by a function, so I thought I can use anonymous function in this case. Then I tried again and wrote the following code:

defer func() { c <- 1 }

I still got the same complaint from compiler. After more searches, I found that the correct way to do this is:

defer func() { c <- 1 }()

The () means call and execute the anonymous function. If you write only func() { c <- 1 } without (), you only declare the anonymous function without calling it. That’s why I got the same error while compiling.

The following are complete example for using anonymous function in defer statement.

package main

import (

func routine(site string, c chan int) {
      defer func() { c <- 1 }()

      // do something

func main() {
      c := make(chan int)

      sites := []string{

      for _, site := range sites {
              go routine(site, c)

      // wait all goroutines to finish
      for i := 0; i < len(sites); i++ {

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Любишь мемасики?

Подпишись на мой телеграм-канал!