如何从Go设置errno

I have a C function calling a Go routine via cgo. I need to Go routine to set the errno correctly so the C thread can inspect it's errno and act accordingly. Unable to google on how to set the errno via Go

Just to clarify, you can still set it via C-function that you call via cgo.

package main

// #include <errno.h>
// #include <stdio.h>
//
// void setErrno(int err) {
//      errno = err;
// }
//
import "C"

func main() {
        C.setErrno(C.EACCES)
        C.perror(C.CString("error detected"))
        C.setErrno(C.EDOM)
        C.perror(C.CString("error detected"))
        C.setErrno(C.ERANGE)
        C.perror(C.CString("error detected"))
}

On my system it outputs

error detected: Permission denied
error detected: Numerical argument out of domain
error detected: Numerical result out of range

You can't refer directly to errno from go, see cgo doesn't like errno on Linux. From that thread:

I don't know what's wrong, but it doesn't matter since that's not a safe use of errno anyway. Every call into C might happen in a different OS thread, which means that referring to errno directly is not guaranteed to get the value you want.

As of 3880041 attempts to refer to C.errno will elicit an error message:

cannot refer to errno directly; see documentation

As pointed out in another answer, setting it from a C function works.