函数
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}