6、函数与方法-GOLANG

函数

需求

某一块的代码需要重复执行,比如一个图书管理系统,我们不能为学校的每一个新生都写一串代码用if进行判断谁是谁来管理积分等操作,这个时候我们就需要某一块逻辑相同的代码针对不同的人来执行

函数声明

使用 func 关键字声明函数

image-20230307125218334

关键字 函数名(参数类型) 返回值类型{

​ 函数体内容

}

举个栗子

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import "fmt"

func sum(a int, b int) int {//声明一个函数用于对两个整数求和,a,b在这里叫做形参
c := a + b//将a和b相加的值赋给一个新变量
return c//返回相加的值,既然有返回值,那么函数在调用的时候就需要接受或者直接打印这个值
}
func main() {

d := sum(1, 2)//调用函数只需要在函数名后面加一个括号,函数有参数的需要传实参
fmt.Println(d)//fmt.Println(sum(1, 2))
}

我们main就是一个特殊的函数,整个go程序回先去找main函数进行执行,没有main函数程序跑不起来,

函数可以有多个参数或者多个返回值

函数调用

同一个包的函数只需要写函数名就可以,但是不同包的函数比如我们用的fmt.Println()就需要在函数前加上包名,并且各位盲点有没有发现一个华生,我们迄今为止调用的跨包函数都是大写字母开头,在go语言只有大写字母开头的函数才可以被其他包调用,相当与java里的public关键字

方法

与函数区别

方法和函数在很长一段时间里我都认为并没有区别,只是面向对象与面向过程的叫法不同,巴特,最近我悟了,

函数与方法最大的区别就在于有没有对象,对象如果不好了解可以带入现实的对象,都是人,有的人有对象,有的人没有对象,没错,说的就是我,没有对象,java中方法属于对象,而在go语言里我们先把对象和类型挂钩,也就是方法属于某个类型

方法声明

注意:预声明的int,float等类型无法关联方法

类型的声明需要用到type

type xiu string

xiu类型就是string类型的别名,他俩底层一样,但是确实不是一个类型,利用Printf打印类型就可以看出来,所以两者不能混用,比如不可以直接相加等操作

image-20230307133338927

方法声明格式

image-20230307132729228

关键字 接收者 方法名 返回类型

接收者只能有一个

栗子

编写一个函数实现开氏温度转化为摄氏度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import "fmt"

func kelvinToCelsius(k float64) float64 { //开氏温度转换为摄氏度
k -= 273.15
return k
}

func main() {
kelvin := 274.0
celsius := kelvinToCelsius(kelvin)
fmt.Printf("%v 开氏温度转换为摄氏度为%v", kelvin, celsius)

}

编写一个方法实现开氏温度转化为摄氏度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import "fmt"

type kelvin float64
type celsius float64

func (k kelvin) Celsius() celsius { //开氏温度转换为摄氏度
return celsius(k - 273.15)//类型转换一下,符合返回值类型
}

func main() {
var k1 kelvin = 274.0
c := k1.Celsius()
fmt.Printf("%v 开氏温度转换为摄氏度为%v", k1, c)

}