GO语言学习笔记2018-09-03

1 Go语言中函数的声明如下: func 函数名 (变量名1,变量名2   变量类型1,变量名3  变量类型2)函数返回值类型{         函数体        }。类型总是在名字后面,先有名字才有的类型。

package main

import (

"fmt"

)

func eval(a, b int, op string) int {

        switch op {

                          case "+":

                        return a + b

                         case "-":

                       return a - b

                        case "*":

                      return a * b

                       case "/":

                     return a / b

                     default:

                    panic("unsupported operation" + op)

                }

}

func main() {

            fmt.Println(eval(3, 4, "*"))

}

输出结果为: 12

2 改良版  (可以解决panic带来的程序完全中断)

package main

import (

"fmt"

)

func eval(a, b int, op string) (int, error) //在这里函数返回类型为两个分别是int类型和error类型{

switch op {

            case "+":

           return a + b, nil //返回两个值

           case "-":

          return a - b, nil

           case "*":

           return a * b, nil

          case "/":

          return a / b, nil

         default:

         return 0, fmt.Errorf(

          "unsupported operation: %s", op)

          }

}

func div(a, b int) (q, r int) {

return a / b, a % b

}

func main() {

fmt.Println(eval(3, 4, "X"))

q, r := div(13, 5) //用q,r来接返回的值

fmt.Println(q, r)

}

输出结果为:   0   unsupported operation: X

2  3


3.函数返回可以返回多个值,在这里值得注意的是,只能用于简单的函数

现在我们再来看上面的加强版:


package main

import (

"fmt"

)

func eval(a, b int, op string) (int, error)//在这里函数返回类型为两个分别是int类型和error类型{

switch op {

            case "+":

           return a + b, nil //返回两个值

           case "-":

          return a - b, nil

           case "*":

           return a * b, nil

          case "/":

          return a / b, nil

         default:

return 0, fmt.Errorf(

          "unsupported operation: %s", op)

          }

}

func div(a, b int) (q, r int) {

return a / b, a % b

}

func 

func main() {

fmt.Println(eval(3, 4, "X"))

q, r := div(13, 5) //用q,r来接返回的值

fmt.Println(q, r)

}\

package main

import (

"fmt"

"math"

"reflect"

"runtime"

)

//在函数中调用函数,用a,b直接传入调用的函数中,并得到被调用的函数名

func apply(op func(int, int) int, a, b int) int {

p := reflect.ValueOf(op).Pointer()

opName := runtime.FuncForPC(p).Name()

fmt.Printf("Calling function %s with args "+"%d,%d\n", opName, a, b)

return op(a, b)

}

func div(a, b int) (q, r int) {

return a / b, a % b

}

func main() {

fmt.Println(eval(3, 4, "X"))

q, r := div(13, 5) //用q,r来接返回的值

fmt.Println(q, r)

fmt.Println(apply(

func(a int, b int) int {

return int(math.Pow(float64(a), float64(b)))//在这里我们调用pow函数,并根据apply函数返回类型把原本的float行式转成int 型。

}, 3, 4))

}

输出结果为: 0 unsupported operation: X

2 3

Calling function main.main.func1 with args 3,4

81//(3^4=81)

5 传入可变参数列表

package main

import (

"fmt"

)

func sum(numbers ...int) int {//这里的省略号表示传入的参数是无限的

                                          s := 0

                                         for i := range numbers {

                                        s += numbers[i]

}

               return s

}

func main() {

                     fmt.Println(sum(1, 2, 3, 4, 5))

}

输出结果为:15

你可能感兴趣的:(GO语言学习笔记2018-09-03)