mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2024-11-28 17:19:06 +00:00
61 lines
1.1 KiB
Go
61 lines
1.1 KiB
Go
|
// 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
|