Go version of Advent of Code, day 5 - Dealing with runes
Your code is pretty idiomatic. The only obvious style thing I'd change is the end of the evaluateIndex function:

if strings.HasPrefix(hash, "00000") {
        return []rune(hash)[5]
}
return 0


you could also write if letter := evaluateIndex(roomId, i); letter != 0 { but it's not that important.

Now, the rune/string/byte question is the interesting one. md5 deals with []byte only; and converting strings to bytes and back is expensive (new memory allocations each time). So I'd change your code to use []byte instead of string, and byte instead of rune. The evaluateIndex function becomes faster:

var prefix = []byte("00000")

func evaluateIndex(roomId []byte, index int) byte {
    bytes := append(roomId, []byte(fmt.Sprint(index))...)
    hash := md5Hash(bytes)
    if bytes.HasPrefix(hash, prefix) {
        return hash[5]
    }
    return 0
}

func md5Hash(bytes []byte) []byte {
    rawHash := md5.Sum(bytes)
    encHash := make([]byte, md5.EncodedLen(len(rawHash)))
    hex.Encode(encHash, rawHash)
    return encHash
}


I put zeroes outside the func, to avoid converting it over and over. You still have a few conversions &amp; allocations, but there's no way around them. The other functions can be modified easily to accommodate the type change.