Skeleton for a command-line tool to scan domains for vulnerabilities
Validation logic

When checking whether the program should print the usage message or not,
I find it an unusual approach to say "is the state (of initial parameter values) unchanged?"
It would be more natural to check facts more directly.
For example in this program the only input you really require is one or more domain names.
Then that should be the determining factor for displaying the usage message: "did the user specify a domain name?"
Direct, straightforward, to the point.

Naming

The current names are not very intuitive:


State is state of what? It's the command line parameters. Something like CmdParams would be better.
Banner is a noun, so it sounds like an object, not something that takes some action. PrintBanner would be better.
Names starting with capital letters are exported (~ public API) in go. Many if not all names in the posted could be private, so their names should start with lowercase.
Instead of InitX, when creating a new instance of X, the name NewX is more common.


Performance

Every time you evaluate s == InitState(), InitState() creates a new instance to perform the comparison. It would be enough to have just one such instance as a frame of reference, created as a var at top-level scope, no need to create a new instance every time.

Style

Many of the functions specify a name for the returned value, but don't actually use it in the function body. So those optional names can be dropped.



Instead of this:


return State { "", "", "", "", false, 20, false, false, false }



You could take advantage of the default zero-values of strings and booleans, and write simpler like this:

return State{Threads: 20}




In my experience, negative boolean variables such as NoColour are often confusing in practice.
Inverting the meaning and using !Colour tends to work better.

Use short boolean conditions

Instead of if state.Silent != true, you can write shorter as if !state.Silent.

Banner printed twice

When the script is called without parameters,
the banner will be printed twice.
Swap these two statements to avoid that.


if state.Silent != true {
    Banner()
}

if libprojectstart.IsUnchanged(*state) || state.Usage {
    Banner()
    flag.PrintDefaults()
    os.Exit(1)
}