liujie
liujie
Published on 2025-02-21 / 3 Visits
0
0

GO 学习(三)

#Go

函数

Go 语言最少有个 main() 函数。

函数声明告诉了编译器函数的名称,返回类型,和参数。

Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中包含的元素个数。

Go 语言函数定义格式如下:

func function_name( [parameter list] ) [return_types] {
   函数体
}

函数定义解析:

  • func:函数由 func 开始声明

  • function_name:函数名称,参数列表和返回值类型构成了函数签名。

  • parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。

  • return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。

  • 函数体:函数定义的代码集合。

函数返回多个值


func swap(x, y string) (string, string) {
   return y, x
}

语言函数作为实参

Go 语言可以很灵活的创建函数,并作为另外一个函数的实参

func main(){
   /* 声明函数变量 */
   getSquareRoot := func(x float64) float64 {
      return math.Sqrt(x)
   }

   /* 使用函数 */
   fmt.Println(getSquareRoot(9))

}

函数闭包(匿名函数)

Go 语言支持匿名函数,可作为闭包。匿名函数是一个"内联"语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。

匿名函数是一种没有函数名的函数,通常用于在函数内部定义函数,或者作为函数参数进行传递。

package main

import "fmt"

func main() {
    // 定义一个加法函数
    add := func(a, b int) int {
        return a + b
    }
    
    // 定义一个乘法函数
    multiply := func(a, b int) int {
        return a * b
    }

    // 将加法函数传递给 calculate
    result1 := calculate(add, 3, 4)
    fmt.Println("Result of addition:", result1)  // 输出: Result of addition: 7

    // 将乘法函数传递给 calculate
    result2 := calculate(multiply, 3, 4)
    fmt.Println("Result of multiplication:", result2)  // 输出: Result of multiplication: 12
}

// calculate 函数接受一个函数作为参数
func calculate(operation func(int, int) int, x, y int) int {
    return operation(x, y)
}

函数方法

Go 语言中同时有函数和方法。一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。语法格式如下:

func (variable_name variable_data_type) function_name() [return_type]{
   /* 函数体*/
}
package main

import (
   "fmt"  
)

/* 定义结构体 */
type Circle struct {
  radius float64
}

//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
  //c.radius 即为 Circle 类型对象中的属性
  return 3.14 * c.radius * c.radius
}

func main() {
  var c1 Circle
  c1.radius = 10.00
  fmt.Println("圆的面积 = ", c1.getArea())
}

变量作用域

1. 块级作用域:变量在其所在的代码块内有效,如函数、if、for 等。

2. 包级作用域:变量在整个包内有效,包括不同文件中的函数。

3. 函数参数和局部变量:它们的作用域仅限于函数内部。

4. 嵌套作用域:内层作用域可以访问外层作用域的变量,但外层作用域无法访问内层作用域的变量。

5. 局部变量屏蔽包级变量:局部变量如果与包级变量同名,则在局部作用域内屏蔽包级变量。

数组

Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:

var arrayName [size]dataType

其中,arrayName是数组的名称,size是数组的大小,dataType是数组中元素的数据类型。

注意:在 Go 语言中,数组的大小是类型的一部分,因此不同大小的数组是不兼容的,也就是说 [5]int[10]int 是不同的类型。

以下定义了数组 numbers 长度为 5 类型为 int:

0. 定义
var numbers [5]int

1. 还可以使用初始化列表来初始化数组的元素:
var numbers = [5]int{1, 2, 3, 4, 5}

2. 还可以使用 := 简短声明语法来声明和初始化数组:
numbers := [5]int{1, 2, 3, 4, 5}

3.  将索引为 1 和 3 的元素初始化
balance := [5]float32{1:2.0,3:7.0}

4. 如果数组长度不确定,可以使用 ... 代替数组的长度,编译器会根据元素个数自行推断数组的长度:
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
或
balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}


Comment