mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-11 23:08:34 +08:00
Merge pull request #317 from appleboy/patch-3
fix: coding style and file format for chapter 6.
This commit is contained in:
@@ -1,13 +1,15 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
printrec(1)
|
||||
}
|
||||
|
||||
func printrec(i int) {
|
||||
if i>10 { return }
|
||||
printrec(i+1)
|
||||
fmt.Printf("%d ", i)
|
||||
}
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
printrec(1)
|
||||
}
|
||||
|
||||
func printrec(i int) {
|
||||
if i > 10 {
|
||||
return
|
||||
}
|
||||
printrec(i + 1)
|
||||
fmt.Printf("%d ", i)
|
||||
}
|
||||
|
@@ -1,17 +1,17 @@
|
||||
// compose.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
func Compose(f, g func(x float64) float64) func(x float64) float64 {
|
||||
return func(x float64) float64 { // closure
|
||||
return f(g(x))
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
fmt.Print(Compose(math.Sin, math.Cos)(0.5)) // output: 0.7691963548410085
|
||||
}
|
||||
// compose.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
func Compose(f, g func(x float64) float64) func(x float64) float64 {
|
||||
return func(x float64) float64 { // closure
|
||||
return f(g(x))
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
fmt.Print(Compose(math.Sin, math.Cos)(0.5)) // output: 0.7691963548410085
|
||||
}
|
||||
|
@@ -1,56 +1,57 @@
|
||||
// error_returnval.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Print("First example with -1: ")
|
||||
ret1, err1 := MySqrt(-1)
|
||||
if err1 != nil {
|
||||
fmt.Println("Error! Return values are: ", ret1, err1)
|
||||
} else {
|
||||
fmt.Println("It's ok! Return values are: ", ret1, err1)
|
||||
}
|
||||
|
||||
fmt.Print("Second example with 5: ")
|
||||
//you could also write it like this
|
||||
if ret2, err2 := MySqrt(5); err2 != nil {
|
||||
fmt.Println("Error! Return values are: ", ret2, err2)
|
||||
} else {
|
||||
fmt.Println("It's ok! Return values are: ", ret2, err2)
|
||||
}
|
||||
// named return variables:
|
||||
fmt.Println(MySqrt2(5))
|
||||
}
|
||||
|
||||
func MySqrt(f float64) (float64, error) {
|
||||
//return an error as second parameter if invalid input
|
||||
if (f < 0) {
|
||||
return float64(math.NaN()), errors.New("I won't be able to do a sqrt of negative number!")
|
||||
}
|
||||
//otherwise use default square root function
|
||||
return math.Sqrt(f), nil
|
||||
}
|
||||
|
||||
//name the return variables - by default it will have 'zero-ed' values i.e. numbers are 0, string is empty, etc.
|
||||
func MySqrt2(f float64) (ret float64, err error) {
|
||||
if (f < 0) {
|
||||
//then you can use those variables in code
|
||||
ret = float64(math.NaN())
|
||||
err = errors.New("I won't be able to do a sqrt of negative number!")
|
||||
} else {
|
||||
ret = math.Sqrt(f)
|
||||
//err is not assigned, so it gets default value nil
|
||||
}
|
||||
//automatically return the named return variables ret and err
|
||||
return
|
||||
}
|
||||
/* Output:
|
||||
First example with -1: Error! Return values are: NaN I won't be able to do a sqrt of negative number!
|
||||
Second example with 5: It's ok! Return values are: 2.23606797749979 <nil>
|
||||
2.23606797749979 <nil>
|
||||
*/
|
||||
// error_returnval.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Print("First example with -1: ")
|
||||
ret1, err1 := MySqrt(-1)
|
||||
if err1 != nil {
|
||||
fmt.Println("Error! Return values are: ", ret1, err1)
|
||||
} else {
|
||||
fmt.Println("It's ok! Return values are: ", ret1, err1)
|
||||
}
|
||||
|
||||
fmt.Print("Second example with 5: ")
|
||||
//you could also write it like this
|
||||
if ret2, err2 := MySqrt(5); err2 != nil {
|
||||
fmt.Println("Error! Return values are: ", ret2, err2)
|
||||
} else {
|
||||
fmt.Println("It's ok! Return values are: ", ret2, err2)
|
||||
}
|
||||
// named return variables:
|
||||
fmt.Println(MySqrt2(5))
|
||||
}
|
||||
|
||||
func MySqrt(f float64) (float64, error) {
|
||||
//return an error as second parameter if invalid input
|
||||
if f < 0 {
|
||||
return float64(math.NaN()), errors.New("I won't be able to do a sqrt of negative number!")
|
||||
}
|
||||
//otherwise use default square root function
|
||||
return math.Sqrt(f), nil
|
||||
}
|
||||
|
||||
//name the return variables - by default it will have 'zero-ed' values i.e. numbers are 0, string is empty, etc.
|
||||
func MySqrt2(f float64) (ret float64, err error) {
|
||||
if f < 0 {
|
||||
//then you can use those variables in code
|
||||
ret = float64(math.NaN())
|
||||
err = errors.New("I won't be able to do a sqrt of negative number!")
|
||||
} else {
|
||||
ret = math.Sqrt(f)
|
||||
//err is not assigned, so it gets default value nil
|
||||
}
|
||||
//automatically return the named return variables ret and err
|
||||
return
|
||||
}
|
||||
|
||||
/* Output:
|
||||
First example with -1: Error! Return values are: NaN I won't be able to do a sqrt of negative number!
|
||||
Second example with 5: It's ok! Return values are: 2.23606797749979 <nil>
|
||||
2.23606797749979 <nil>
|
||||
*/
|
||||
|
@@ -1,34 +1,34 @@
|
||||
// factorial.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
for i := uint64(0); i < uint64(30); i++ {
|
||||
fmt.Printf("Factorial of %d is %d\n", i, Factorial(i))
|
||||
}
|
||||
}
|
||||
|
||||
/* unnamed return variables:
|
||||
func Factorial(n uint64) uint64 {
|
||||
if n > 0 {
|
||||
return n * Factorial(n-1)
|
||||
}
|
||||
return 1
|
||||
}
|
||||
*/
|
||||
|
||||
// named return variables:
|
||||
func Factorial(n uint64) (fac uint64) {
|
||||
fac = 1
|
||||
if n > 0 {
|
||||
fac = n * Factorial(n-1)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// int: correct results till 12!
|
||||
// uint64: correct results till 21!
|
||||
// factorial.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
for i := uint64(0); i < uint64(30); i++ {
|
||||
fmt.Printf("Factorial of %d is %d\n", i, Factorial(i))
|
||||
}
|
||||
}
|
||||
|
||||
/* unnamed return variables:
|
||||
func Factorial(n uint64) uint64 {
|
||||
if n > 0 {
|
||||
return n * Factorial(n-1)
|
||||
}
|
||||
return 1
|
||||
}
|
||||
*/
|
||||
|
||||
// named return variables:
|
||||
func Factorial(n uint64) (fac uint64) {
|
||||
fac = 1
|
||||
if n > 0 {
|
||||
fac = n * Factorial(n-1)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// int: correct results till 12!
|
||||
// uint64: correct results till 21!
|
||||
|
@@ -1,24 +1,24 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
pos := 4
|
||||
result, pos := fibonacci(pos)
|
||||
fmt.Printf("the %d-th fibonacci number is: %d\n", pos, result)
|
||||
pos = 10
|
||||
result, pos = fibonacci(pos)
|
||||
fmt.Printf("the %d-th fibonacci number is: %d\n", pos, result)
|
||||
}
|
||||
|
||||
func fibonacci(n int) (val, pos int) {
|
||||
if n <= 1 {
|
||||
val = 1
|
||||
} else {
|
||||
v1, _ := fibonacci(n-1)
|
||||
v2, _ := fibonacci(n-2)
|
||||
val = v1 + v2
|
||||
}
|
||||
pos = n
|
||||
return
|
||||
}
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
pos := 4
|
||||
result, pos := fibonacci(pos)
|
||||
fmt.Printf("the %d-th fibonacci number is: %d\n", pos, result)
|
||||
pos = 10
|
||||
result, pos = fibonacci(pos)
|
||||
fmt.Printf("the %d-th fibonacci number is: %d\n", pos, result)
|
||||
}
|
||||
|
||||
func fibonacci(n int) (val, pos int) {
|
||||
if n <= 1 {
|
||||
val = 1
|
||||
} else {
|
||||
v1, _ := fibonacci(n - 1)
|
||||
v2, _ := fibonacci(n - 2)
|
||||
val = v1 + v2
|
||||
}
|
||||
pos = n
|
||||
return
|
||||
}
|
||||
|
@@ -1,20 +1,20 @@
|
||||
package main
|
||||
|
||||
// fib returns a function that returns
|
||||
// successive Fibonacci numbers.
|
||||
func fib() func() int {
|
||||
a, b := 1, 1
|
||||
return func() int {
|
||||
a, b = b, a+b
|
||||
return b
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
f := fib()
|
||||
// Function calls are evaluated left-to-right.
|
||||
// println(f(), f(), f(), f(), f())
|
||||
for i:=0; i<=9; i++ {
|
||||
println(i+2, f() )
|
||||
}
|
||||
}
|
||||
package main
|
||||
|
||||
// fib returns a function that returns
|
||||
// successive Fibonacci numbers.
|
||||
func fib() func() int {
|
||||
a, b := 1, 1
|
||||
return func() int {
|
||||
a, b = b, a+b
|
||||
return b
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
f := fib()
|
||||
// Function calls are evaluated left-to-right.
|
||||
// println(f(), f(), f(), f(), f())
|
||||
for i := 0; i <= 9; i++ {
|
||||
println(i+2, f())
|
||||
}
|
||||
}
|
||||
|
@@ -1,37 +1,37 @@
|
||||
// function_filter2.go
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type flt func(int) bool
|
||||
|
||||
// func isEven(n int) bool { if n%2 == 0 { return true }; return false }
|
||||
func isEven(n int) bool {
|
||||
if n%2 == 0 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func filter(sl []int, f flt) (yes, no []int) {
|
||||
for _, val := range sl {
|
||||
if f(val) {
|
||||
yes = append(yes, val)
|
||||
} else {
|
||||
no = append(no, val)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func main() {
|
||||
slice := []int{1, 2, 3, 4, 5, 7}
|
||||
fmt.Println("slice = ", slice)
|
||||
even, odd := filter(slice, isEven)
|
||||
fmt.Println("The even elements of slice are: ", even)
|
||||
fmt.Println("The odd elements of slice are: ", odd)
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
*/
|
||||
// function_filter2.go
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type flt func(int) bool
|
||||
|
||||
// func isEven(n int) bool { if n%2 == 0 { return true }; return false }
|
||||
func isEven(n int) bool {
|
||||
if n%2 == 0 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func filter(sl []int, f flt) (yes, no []int) {
|
||||
for _, val := range sl {
|
||||
if f(val) {
|
||||
yes = append(yes, val)
|
||||
} else {
|
||||
no = append(no, val)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func main() {
|
||||
slice := []int{1, 2, 3, 4, 5, 7}
|
||||
fmt.Println("slice = ", slice)
|
||||
even, odd := filter(slice, isEven)
|
||||
fmt.Println("The even elements of slice are: ", even)
|
||||
fmt.Println("The odd elements of slice are: ", odd)
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
*/
|
||||
|
@@ -1,18 +1,19 @@
|
||||
// lambda_value.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fv := func() {
|
||||
fmt.Println("Hello World!")
|
||||
}
|
||||
fv()
|
||||
fmt.Printf("The type of fv is %T", fv)
|
||||
}
|
||||
/* Output:
|
||||
Hello World!
|
||||
The type of fv is func()
|
||||
*/
|
||||
// lambda_value.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fv := func() {
|
||||
fmt.Println("Hello World!")
|
||||
}
|
||||
fv()
|
||||
fmt.Printf("The type of fv is %T", fv)
|
||||
}
|
||||
|
||||
/* Output:
|
||||
Hello World!
|
||||
The type of fv is func()
|
||||
*/
|
||||
|
@@ -1,24 +1,25 @@
|
||||
// mult_returnval.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func SumProductDiff(i, j int) (int, int, int) {
|
||||
return i+j, i*j, i-j
|
||||
}
|
||||
|
||||
func SumProductDiffN(i, j int) (s int, p int, d int) {
|
||||
s, p, d = i+j, i*j, i-j
|
||||
return
|
||||
}
|
||||
|
||||
func main() {
|
||||
sum, prod, diff := SumProductDiff(3,4)
|
||||
fmt.Println("Sum:", sum, "| Product:",prod, "| Diff:", diff)
|
||||
sum, prod, diff = SumProductDiffN(3,4)
|
||||
fmt.Println("Sum:", sum, "| Product:",prod, "| Diff:", diff)
|
||||
}
|
||||
// Sum: 7 | Product: 12 | Diff: -1
|
||||
// Sum: 7 | Product: 12 | Diff: -1
|
||||
// mult_returnval.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func SumProductDiff(i, j int) (int, int, int) {
|
||||
return i + j, i * j, i - j
|
||||
}
|
||||
|
||||
func SumProductDiffN(i, j int) (s int, p int, d int) {
|
||||
s, p, d = i+j, i*j, i-j
|
||||
return
|
||||
}
|
||||
|
||||
func main() {
|
||||
sum, prod, diff := SumProductDiff(3, 4)
|
||||
fmt.Println("Sum:", sum, "| Product:", prod, "| Diff:", diff)
|
||||
sum, prod, diff = SumProductDiffN(3, 4)
|
||||
fmt.Println("Sum:", sum, "| Product:", prod, "| Diff:", diff)
|
||||
}
|
||||
|
||||
// Sum: 7 | Product: 12 | Diff: -1
|
||||
// Sum: 7 | Product: 12 | Diff: -1
|
||||
|
@@ -1,13 +1,19 @@
|
||||
// strings_map.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
asciiOnly := func(c rune) rune { if c > 127 { return ' ' }; return c }
|
||||
fmt.Println(strings.Map(asciiOnly, "Jérôme Österreich"))
|
||||
}
|
||||
// J r me sterreich
|
||||
// strings_map.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
asciiOnly := func(c rune) rune {
|
||||
if c > 127 {
|
||||
return ' '
|
||||
}
|
||||
return c
|
||||
}
|
||||
fmt.Println(strings.Map(asciiOnly, "Jérôme Österreich"))
|
||||
}
|
||||
|
||||
// J r me sterreich
|
||||
|
@@ -1,23 +1,23 @@
|
||||
// Q10_varargs.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
printInts()
|
||||
println()
|
||||
printInts(2, 3)
|
||||
println()
|
||||
printInts(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
|
||||
}
|
||||
|
||||
func printInts(list ...int) {
|
||||
// for i:=0; i<len(list); i++ {
|
||||
// fmt.Printf("%d\n", list[i])
|
||||
// }
|
||||
for _, v := range list {
|
||||
fmt.Printf("%d\n", v)
|
||||
}
|
||||
}
|
||||
// Q10_varargs.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
printInts()
|
||||
println()
|
||||
printInts(2, 3)
|
||||
println()
|
||||
printInts(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
|
||||
}
|
||||
|
||||
func printInts(list ...int) {
|
||||
// for i:=0; i<len(list); i++ {
|
||||
// fmt.Printf("%d\n", list[i])
|
||||
// }
|
||||
for _, v := range list {
|
||||
fmt.Printf("%d\n", v)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user