九.函数
在Go语言中,函数是一种非常重要的概念,因为它可以将代码组织成可重用的逻辑单元。本篇文章将详细介绍Go语言函数的各种特性和用法,包括函数定义、参数传递、返回值、作用域、闭包、defer语句和函数类型等。
结构
在Go语言中,使用关键字func定义函数。函数名和参数列表放在括号中,函数体放在花括号内。
func 函数名(参数)
{
数据定义
方法
return ...
}
举例 实现两个变量相加的函数。
Go语言和其他很多语言不一样的是,变量类型是后置的。
Go里面的函数原生支持返回多个值。在实际的业务逻辑代码里面几乎所有的函数都返回两个值,第一个是真正的返回结果,第二个值是一个错误信息。
func add(a int , b int) int ,err
{//a int , b int == a , b int俩种方式都一样
return a + b //后面的是返回值
}
func add(a , b int)(int , error){ //可返回多个值
return a + b , nil
}
func Tmp(a , b int){
func() int {//还可以在函数内部定义一个匿名函数,类似别的语言lambda函数
return 5
}()//加上()表示直接调用
}
函数的参数传递
在Go语言中,函数参数可以是值参数或引用参数。值参数是复制传递,而引用参数是传递指针。
函数的返回值
在Go语言中,使用关键字return返回一个或多个值。如果函数没有返回值,则可以省略return语句。
十.指针
定义:指针存储的是数据的地址
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
指针数组
func main(){
var list = [3] int {1,2,3}
var str [3] *int
for i := 0; i < 3; i++{
str[i] = &list[i]
}
for i := 0; i < 3; i++{
fmt.Println(*str[i])
}
}
指针使用流程:
- 定义指针变量。
- 为指针变量赋值。
- 访问指针变量中指向地址的值。
在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。
Go 空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
一个指针变量通常缩写为 ptr。
十一.结构体
结构体是一种用户自定义的数据类型,它由一组字段组成,每个字段可以是任意基本类型或其他结构体类型。结构体在Go语言中被广泛使用,它可以用来表示复杂的数据结构,比如二叉树、链表、图等。
定义结构体
func main(){
type student struct{
name string
age int
address string
}
stu1 := student{"jack", 15, "西安"}
stu2 := student{name: "jack", age: 15, address: "西安"}
fmt.Println(stu1.name)
fmt.Println(stu2.name)
}
结构体函数
与相比其他语言,结构体成员函数是在外面定义的
type person struct {
name, city string
age int8
}
// (接收者变量 接收者类型) 方法名(参数列表) (返回参数)
// 不可修改成员的值
// 方法与函数的区别是,函数不属于任何类型,方法属于特定的类型。
func (p person) Dream() {
fmt.Printf("%s的梦想是学好Go语言!\n", p.name)
}
// 可修改成员的值
func (p *person) SetAge(newAge int8) {
p.age = newAge
}
结构体作为函数参数
func show_Student(stu Student){
if stu != (Student{}){
fmt.Println("学生的姓名是:",stu.name)
fmt.Println("学生的年龄是:",stu.age)
fmt.Println("学生的地址是:",stu.address)
}
}
func main(){
var stu3 Student
stu3 = Student{"jack", 23, "西安"}
show_Student(stu3)
}
结构体的访问
在Go语言中,我们可以通过结构体变量的字段名来访问结构体中的成员。
结构体的方法
Go语言中的结构体还支持方法,方法是一种特殊的函数,它可以与结构体类型关联。方法与函数的区别在于,方法必须在结构体类型上定义,而函数可以在任何地方定义。另外,方法可以访问结构体的成员,而函数只能访问其参数。
十二.错误处理
errors.New()和panic //自定义错误
func test(){
defer func() {
err := recover() //recover内置函数,可以捕获到异常
if err != nil{ //说明捕获到异常
fmt.Println("err=", err)
}
}()
num1 := 10
num2 := 0
result := num1/ num2
fmt.Println(result)
fmt.Println("执行到这里了")
}
func main() {
test()
fmt.Println("执行到这里了")
}