I don't think it's valid comparison to Go, since that's a garbage collected language.
Overall Zig feels closer in intent to C than most "better C" languages. In its current form it has a lot of attention to detail about its behavior around common edge cases. It cares about not blowing the stack and dealing with OOM, and the default behavior of numeric overflow is a crash. Stuff that allocates to the heap is stuff that the programmer is made aware of, and "defer" is one of those little additions. It's less developed w/r to higher level abstractions, with the exception of a strong metaprogramming facility and sum types.
https://eigenstate.org/archive/myrddin-dev/2018-Jan/0000008....
I think there are still going to be some changes before it stabilizes, but it's currently in master.
That is, it makes non-leaky code nicer, but it does not ensure that code is non-leaky.
In go, defer appends a function call to a heap allocated list that gets run at the end of a function.
In zig, defer (and errdefer) do not allocate memory, and get run at scope exit.