Not to discount your point, but I want to offer my opinion which is different.
I had fun _because_ it was more constrained. But I also like Go.
As an example, I solved level 6 in what I understand to be an unconventional way:
(spoiler alert)
I realized I could “get out” of readCodesFromKeypad function scope by ending it early and then writing the start of another top level function. Once I had access to global scope, I could add an init() function to modify the “crypto/rand.Reader” variable and assign to it an io.Reader that I could control. I was on mobile so I decided to take a shortcut and just overwrite the global passcode variable instead.
(end spoiler)
I may have “cheated”, but it felt creative and in spirit of the game, and it got me to the next level.