Go does not force the handling of errors; it forces you to acknowledge that a second return value is given with value, _ := f(). But you can ignore the second value, and you can't tell that it is an error. And it's up to you to check the error; if it is an error you can still try to use the bogus first value.
Rust (and Scala and various other languages with a Result, Either, Or, etc. type) actually force the handling of errors.
If you want the success branch, you have to go get it, and if it's the error branch there is no success value to get, and it's clearly documented in types that this is exactly what is going on. (There are also helper methods that allow you to propagate errors if that's what you want.)
Go's error handling beats C, but that's a very low bar to pass.