Go has tried to avoid libc where possible, but Linux is rather unusual in that raw syscalls can be done reliability with assembly code. Rust just uses libc to sidestep the hassle (and perhaps better interface with C code, not sure).