trunccpy() is strndup().
Yes, allowing for passing sizeof-1 instead. And the extra malloc and
free, or piece of work for the GC.
Go-1.0 used a conservative GC and it was fast enough.
Yes, but AIUI Go's GC was built into the language's runtime and could
use knowledge produced by the compiler to ease its work, e.g. here's a
mask for a struct's layout saying where there are addresses. It wasn't
a bolt-on GC that looked at a word's bits and cogitated if it was a
pointer that kept something alive.
Also note Go strings are variable sized.
And immutable. :-)