Private

Declarations are public by default: any file in the same module, or any file that imports the module, can use them. Marking a declaration private restricts its use to the module it's declared in: any file in the same module can use it, but a file that merely imports the module gets a warning when using it. private can be applied to struct members, functions, global variables, and types.

struct Settings {
    private int retries;
}

private int defaultRetries() {
    return 3;
}

void main() {
    // Using private declarations is fine in the file they're declared in.
    var settings = Settings(retries = defaultRetries());
    println(settings.retries); // prints 3
}

Using a private declaration from another module produces a warning, not an error: private marks an implementation detail, but nothing stops you from using it if you really need to.

Private and public

private is the only access specifier. (The public marker on function parameters is unrelated: it enables named arguments, not access control.) Interface members cannot be private either, since implementing types in other files must provide them.