GO基础之函数

一、Go语言函数的格式

函数构成了代码执行的逻辑结构,在Go语言中,函数的基本组成为:关键字 func、函数名、参数列表、返回值、函数体和返回语句,每一个程序都包含很多的函数,函数是基本的代码块。

函数的要素:

  • 函数名:需要调用的函数名。
  • 参数列表:参数变量以逗号分隔,尾部无须以分号结尾。
  • 返回值变量列表:多个返回值使用逗号分隔。
// 没有返回值的函数
func log(message string) {
}

// 有一个返回值的函数
func add(a , b int) int {
    return var1
}
// 有多个返回值的函数
func power(name string) (int, bool) {
    return  var1,var2
}

// 给返回值 命名
func add(a, b int) (c int) {
    c = a + b
    return c
}

多返回值函数的使用

func main() {
    a := 0
    b := 0
    a, b = addAndMultiply(10, 20)
    fmt.Println("a=", a)
    fmt.Println("b=", b)
}
func addAndMultiply(a, b int) (int, int) {
    return a + b, a * b
}

二、函数作为参数

package main

import "fmt"
import "strings"

func main() {
    str := strToCase("ABDCFSDFE", processLetter)
    fmt.Println(str)
}

//将函数作为参数
func strToCase(str string, myfunc func(string) string) string {
    return myfunc(str)
}

//字符串奇偶交替
func processLetter(str string) (result string) {
    for i, value := range str {
        if i%2 == 0 {
            result += strings.ToUpper(string(value))
        } else {
            result += strings.ToLower(string(value))
        }
    }
    return result
}

使用 type自定义类型 

package main

import "fmt"
import "strings"

func main() {
    str := strToCase("ABDCFSDFE", processLetter)
    fmt.Println(str)
}

//将函数作为参数(使用type定义的参数类型)
func strToCase(str string, myfunc processLetterFunc) string {
    return myfunc(str)
}

//使用type 为processLetter() 函数定义类型
type processLetterFunc func(string) string

//字符串奇偶交替
func processLetter(str string) (result string) {
    for i, value := range str {
        if i%2 == 0 {
            result += strings.ToUpper(string(value))
        } else {
            result += strings.ToLower(string(value))
        }
    }
    return result
}

三、匿名函数

匿名函数的格式与使用

package main

import "fmt"
import "strings"

func main() {
    //创建匿名函数并直接使用
    func(str string) {
        fmt.Println("str=", str)
    }("hello")
    //将匿名函数赋值给一个变量
    fun := func(str string) {
        fmt.Println("str=", str)
    }
    fun("word")

    //将匿名函数赋值给一个变量(有返回值)
    rFun := func(str string) string {
        return strings.ToUpper(str)
    }
    result := rFun("Hello word")
    fmt.Println("result=", result)
}

 匿名函数作为回调函数的使用

package main

import "fmt"
import "math"

func main() {
    arr := []float64{1, 2, 3, 4, 5}

    //匿名函数的使用进行平方根的运算
    result := filterSlice(arr, func(str float64) string {
        str = math.Sqrt(str)
        return fmt.Sprintf("%.2f", str)
    })
    fmt.Println("result=", result)
}

type fs func(float64) string

//遍历切片,对每个数据进行处理
func filterSlice(arr []float64, f fs) []string {
    var result []string
    for _, value := range arr {
        result = append(result, f(value))
    }
    return result
}

 

 

 

二、变量的作用域

1、局部变量与全局变量同名时,局部变量优先

//全局变量
var num int = 100
var num2 int = 200

func main() {
    num, num2 := 1, 2
    fmt.Println("num=", num)  // num=1
    fmt.Println("num2=", num2)// num2=2
}

 

posted @ 2019-10-30 23:53  小禾点点  阅读(192)  评论(0编辑  收藏  举报