An idea I've played with in the past is health that regenerates as you walk, at a rate roughly timed to match up with the damage you take from random encounters. This way you could only stay in a certain area for a certain amount of time, and have your health always be a point of tension, before having to retreat to a safe zone like a town and wait for your health to regenerate (or it could regenerate as soon as you return there).
This idea reminds me a little bit of Pokemon, where the IV (initial values) and EV (effort values) of a Pokemon determine what the pokemon will excel in, but are for the most part kept hidden from the player. Those interested in competitive battling can figure out IVs and breed for the ones they want, and can train specifically for the EV they want. This adds a lot of depth to a seemingly simple levelling system.
This works well in Pokemon because you can catch multiples of a character and breed/train in specific ways, etc. However, such a system may require some tweaking if you only get the one character to play.
I work with Go on a daily basis, but never in game development. I've never done any benchmarking but it's definitely performant enough for any web server (Google does use it for production web servers) and the amazingly speedy compile time alone is enough to make up for any minor performance downfalls IMO.
To comment on your specific question about string vs char, you can have fixed-size byte arrays in Go and cast between them and strings. In general I find Go a great language, but the libraries for it are still very immature.