// Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan. // License: https://creativecommons.org/licenses/by-nc-sa/4.0/ // See page 86. // Rev reverses a slice. package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func main() { //!+array a := [...]int{0, 1, 2, 3, 4, 5} reverse(a[:]) fmt.Println(a) // "[5 4 3 2 1 0]" //!-array //!+slice s := []int{0, 1, 2, 3, 4, 5} // Rotate s left by two positions. reverse(s[:2]) reverse(s[2:]) reverse(s) fmt.Println(s) // "[2 3 4 5 0 1]" //!-slice // Interactive test of reverse. input := bufio.NewScanner(os.Stdin) outer: for input.Scan() { var ints []int for _, s := range strings.Fields(input.Text()) { x, err := strconv.ParseInt(s, 10, 64) if err != nil { fmt.Fprintln(os.Stderr, err) continue outer } ints = append(ints, int(x)) } reverse(ints) fmt.Printf("%v\n", ints) } // NOTE: ignoring potential errors from input.Err() } //!+rev // reverse reverses a slice of ints in place. func reverse(s []int) { for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { s[i], s[j] = s[j], s[i] } } //!-rev