Compiler Directives#

The Go compiler supports a few compiler directives. A compiler directive uses a // comment at the start of a line. There must be no space between the // and the name of the directive.

//line file:line

The //line directive specifies that the source line that follows should be recorded as having come from the given file path and line number. Successive lines are recorded using increasing line numbers, until the next directive. This directive typically appears in machine-generated code, so that compilers and debuggers will show lines in the original input to the generator.

//extern extern_name

The extern directive sets the externally visible name of the next function declaration. See Function Names.

//go:compile go_nameextern_name

The go:compile directives sets the externally visible name of a function definition or declaration. See Function Names.

//go:noescape

The //go:noescape directive specifies that the next declaration in the file, which must be a func without a body (meaning that it has an implementation not written in Go) does not allow any of the pointers passed as arguments to escape into the heap or into the values returned from the function. This information can be used during the compiler’s escape analysis of Go code calling the function.

//go:nosplit

The //go:nosplit directive specifies that the next function declared in the file must not include a stack overflow check. This is most commonly used by low-level runtime sources invoked at times when it is unsafe for the calling goroutine to be preempted.

//go:noinline

The //go:noinline directive specifies that the next function defined in the file may not be inlined.