Go语言进阶:函数、指针、错误处理

一、函数

函数是基本的代码块,用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。

函数声明包括函数名﹑形式参数列表﹑返回值列表(可省略)以及函数体。

func name( parameter-list ) [result-list] {
    body
}
  • 形式参数列表描逑了函数的参数名以及参数类型。这些参数作为局部变量,被初始化为参数调用者提供的值,或默认为参数类型的值(int 0;string " ")。当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
  • 函数使用参数,可以通过两种方式传参:
  1. 值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
  2. 引用传递:引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
  • 返回值列表描述了函数返回值的变量名以及类型。如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的。如果一个函数声明不包括返回值列表,那么函数体执行完毕后,不会返回任何值。

二、递归函数

函数是可以递归的,在运行时直接或间接的自己调用自己。 我们在使用递归时,程序员需要设置边界条件,否则递归将陷入无限循环中。

实例:

Go语言递归实现阶乘

package main

import "fmt"

func Factorial(n uint64)(result uint64) {
    if (n > 0) {
        result = n * Factorial(n-1)
        return result
    }
    return 1
}

func main() {  
    var i int = 15
    fmt.Printf("%d 的阶乘是 %d\n", i, Factorial(uint64(i)))
}

Go语言递归实现斐波那契数列

package main

import "fmt"

func fibonacci(n int) int {
  if n < 2 {
   return n
  }
  return fibonacci(n-2) + fibonacci(n-1)
}

func main() {
    var i int
    for i = 0; i < 10; i++ {
       fmt.Printf("%d\t", fibonacci(i))
    }
}

三、指针

Go语言中的指针是一种特殊的数据类型,用于存储变量的内存地址。指针变量可以指向任何数据类型,包括基本类型、结构体、数组、函数等。

声明指针变量时需要使用*符号,例如:

var ptr *int

//表示声明了一个指向整型变量的指针。

指针变量可以通过&操作符取得变量的地址,例如ptr = &num表示将整型变量num的地址赋值给指针变量ptr

通过指针变量可以访问和修改指向的变量的值,可以使用*操作符来解引用指针,例如*ptr表示获取指针变量ptr所指向的变量的值。可以通过解引用操作符修改指向的变量的值,例如*ptr = 10表示将指针变量ptr所指向的变量的值修改为10。

指针也可以用于函数传参,通过传递指针可以实现对变量的引用传递,可以在函数内部修改变量的值,对外部产生影响。

需要注意的是,在Go语言中,指针不能进行运算和比较,也没有指针运算符->。此外,Go语言的垃圾回收机制可以自动管理内存,因此不需要手动释放指针所指向的内存。

四、错误处理

Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 error 类型是一个接口类型,这是它的定义:

type error interface {
    Error() string
}

我们可以在编码中通过实现 error 接口类型来生成错误信息。

函数通常在最后的返回值中返回错误信息。使用 errors.New 可返回一个错误信息:

func Sqrt(f float64) (float64, error) {
    if f < 0 {
        return 0, errors.New("math: square root of negative number")
    }
    // 实现
}

猜你喜欢

转载自blog.csdn.net/weixin_53472334/article/details/132392911