What is a rune?
Solution 1:
Rune literals are just 32-bit integer values (however they're untyped constants, so their type can change). They represent unicode codepoints. For example, the rune literal 'a'
is actually the number 97
.
Therefore your program is pretty much equivalent to:
package main
import "fmt"
func SwapRune(r rune) rune {
switch {
case 97 <= r && r <= 122:
return r - 32
case 65 <= r && r <= 90:
return r + 32
default:
return r
}
}
func main() {
fmt.Println(SwapRune('a'))
}
It should be obvious, if you were to look at the Unicode mapping, which is identical to ASCII in that range. Furthermore, 32 is in fact the offset between the uppercase and lowercase codepoint of the character. So by adding 32
to 'A'
, you get 'a'
and vice versa.
Solution 2:
From the Go lang release notes: http://golang.org/doc/go1#rune
Rune is a Type. It occupies 32bit and is meant to represent a Unicode CodePoint.
As an analogy the english characters set encoded in 'ASCII' has 128 code points. Thus is able to fit inside a byte (8bit). From this (erroneous) assumption C treated characters as 'bytes' char
, and 'strings' as a 'sequence of characters' char*
.
But guess what. There are many other symbols invented by humans other than the 'abcde..' symbols. And there are so many that we need 32 bit to encode them.
In golang then a string
is a sequence of bytes
. However, since multiple bytes can represent a rune code-point, a string value can also contain runes. So, it can be converted to a []rune
, or vice versa.
The unicode package http://golang.org/pkg/unicode/ can give a taste of the richness of the challenge.