code: func ClosureNew(f interface{}, marshalData ...interface{}) (*C.GClosure, error) {
  	// Create a reflect.Value from f.  This is called when the
  	// returned GClosure runs.
  	rf := reflect.ValueOf(f)
  
  	// Create closure context which points to the reflected func.
  	cc := closureContext{rf: rf}
  
  	// Closures can only be created from funcs.
  	if rf.Type().Kind() != reflect.Func {
  		return nil, errors.New("value is not a func")
  	}
  
  	if len(marshalData) > 0 {
  		cc.userData = reflect.ValueOf(marshalData[0])
  	}
  
  	c := C._g_closure_new()
  
  	// Associate the GClosure with rf.  rf will be looked up in this
  	// map by the closure when the closure runs.
  	closures.Lock()
  	closures.m[c] = cc
  	closures.Unlock()
  
  	return c, nil
  }
docs: // ClosureNew creates a new GClosure and adds its callback function
  // to the internally-maintained map. It's exported for visibility to other
  // gotk3 packages and shouldn't be used in application code.