integer in Go

Type | Storage size | Value range
--- | --- | --- 
int8 | 1 byte | -2<sup>7</sup> to 2<sup>7</sup>-1
uint8 | 1 byte | 0 to 2<sup>8</sup>-1
byte	| 1 byte | alias for uint8
int16 | 2 bytes | -2<sup>15</sup> to 2<sup>15</sup>-1
uint16| 2 bytes | 0 to 2<sup>16</sup>-1
int32 | 4 bytes | -2<sup>31</sup> to 2<sup>31</sup>-1
rune	| 4 bytes | alias for int32 (represents a Unicode code point)
uint32 | 4 bytes | 0 to 2<sup>32</sup>-1
int | 4 bytes or 8 bytes | -2<sup>31</sup> to 2<sup>31</sup>-1 or 2<sup>63</sup> to 2<sup>63</sup>-1
uint | 4 bytes or 8 bytes | 0 to 2<sup>32</sup>-1 or 0 to 2<sup>64</sup>-1
uintptr | 4 bytes or 8 bytes | an unsigned integer large enough to store the uninterpreted bits of a pointer value
int64 | 8 bytes | -2<sup>63</sup> to 2<sup>63</sup>-1
uint64 | 8 bytes | 0 to 2<sup>64</sup>-1

The uintptr is there to bypass the type system and allow Go to write runtime libraries, including the garbage collection system, in Go, and to call C-callable code including system calls using C pointers that are not handled by Go at all. If you're an implementer - e.g., providing access to system calls on a new OS - you'll need uintptr. 

```
package main
import "fmt"

func main() {
    var i8 int8 = -1
    fmt.Println(i8)
    var ui8 uint8 = 1
    fmt.Println(ui8)
    var b byte = 1
    fmt.Println(b)
    var i16 int16 = -1
    fmt.Println(i16)
    var ui16 int16 = 1
    fmt.Println(ui16)
    var i32 int32 = -1
    fmt.Println(i32)
    var r rune = 1
    fmt.Println(r)
    var ui32 uint32 = 1
    fmt.Println(ui32)
    var i int = -1
    fmt.Println(i)
    var ui uint = 1
    fmt.Println(ui)
    var uip uintptr = 1
    fmt.Println(uip)
    var i64 int64 = -1
    fmt.Println(i64)
    var ui64 uint64 = 1
    fmt.Println(ui64)
}
```
Outputs:
```
-1
1
1
-1
1
-1
1
1
-1
1
1
-1
1
```