Underscore is a special character in Odin that enables us to ignore something.
For example if the function has  @(require_results).
We can ignore the result.
@(require_results)
foo :: proc() -> bool {
    return true
}
@(require_results)
bar :: proc() -> bool, int {
    return true, 2
}
main :: proc() {
    foo() // won't compile
    _ = foo() // Ok
    _, _ = bar() // Ok
}
Also can be used inside switch statements if we don’t need the variable.
Foo :: union {int, bool}
f: Foo = 123
#partial switch _ in f {
   case bool: fmt.println("bool")
}
Also it can be used like this:
import "base:runtime"
_ :: runtime
@Barinzaya explains:
Normally, that would be used to force the right side (runtime in this case) to be considered as used, to prevent errors from unused imports (when compiling with -vet ). You’d normally do that for an import when you want to import something but only conditionally use it (e.g. in a when block) or use it only for side effects. Same idea as doing _ := some_proc() if some_proc requires its results be used, but you want to ignore them anyway.