深入理解与使用go之函数与方法–理解与使用
引子
在 Go 语言中,函数被视为一等公民(First-Class Citizens),这意味着函数可以像其他值(比如整数、字符串等)一样被操作、分配和传递。而方法是附加到给定类型的函数。附加类型称为接收器,可以是指针或值。
我们分别看两个例子:
func Print(r int) {
fmt.Println(r)
}
func Add(a, b int) int {
var r int
defer Print(r)
r = a + b
return r
}
func main() {
Add(1, 2)
}
这个打印结果是啥? ,再看下面的例子
type Student struct {
Score int
}
func (s Student) Set(score int) {
s.Score = score
}
func (s Student) Get() int {
return s.Score
}
func main() {
s := &Student{
120}
s.Set(88)
fmt.Println(s.Get())
}
这个最终打印结果怎么不是我们希望的那样,我加地址符了哦,那么问题来了
- defer函数的执行逻辑是啥,他和return到底内个先
- 方法接收器我们应该给指针还是值
- 我们应该使用结果命名参数么
- go函数有可变数量参数么,参数是否有默认值
- 泛型参数用处是什么
- 函数里的变量都在栈上么
带着这些问题,我们来讨论讨论今天要说的函数与方法
函数与方法
分类
老规矩,还是先分类,其实显而易见的我们分成了两类
-
函数
-
根据函数入参
- 普通参数
- 可变参数
- 默认值
-
根据返回命名参数
- 返回类型参数
- 返回命名参数
-
init
初始化函数也值得说一说
-
defer
我觉得有必要把
defer
单独拿出来说说,他和return
的关系在某些情况下很难甄别
-
-
方法
- 根据接收器
- 值接收器
- 指针接收器
- 根据接收器
-
构造函数
函数
函数入参
普通参数
func Add(a, b int) int {
return a + b
}
// 调用: Add(1,2)
可变参数
举个栗子
func Add(s ...int) int {
var sum int
for _, v := range s {
sum += v
}
return sum
}
-
可变参数 以同一类型 带3个点 作为入参
-
如果有多个参数,可变参数只能作为最后一个参数
func Add(name string, s ...int) int
-
可变参数调用 可以不传、传1到多个参数
Add() Add(1) Add(1,2) // ...
-
切片传入可变参数,可以使用语法糖
slice := []int{ 1, 2, 3, 4, 5} Add(slice...)
默认值
默认参数值是指在函数定义中为参数提供一个默认值,如果调用函数时没有提供该参数的值,则使用默认值作为参数值,在 Go 语言中,函数没有直接支持默认参数值的功能。不过,我们可以依赖可变参数来构造一个
func SetProject(serverAddr string, ports ...int) {
var port int
defaultPort := 80
if len(ports) > 0 {
port = ports[0]
} else {
port = defaultPort
}
fmt.Println(port)
// other code here
}
我们调用
func main() {
SetProject("user")
SetProject("user", 8080)
}
这样就解决了 默认值的问题,不过有个弊端,就是我们始终只能有一个默认值参数,如果我们希望有多个呢?文章来源:https://www.toymoban.com/news/detail-843248.html
结构体来凑文章来源地址https://www.toymoban.com/news/detail-843248.html
type Project struct {
ServerAddr string
Port int
}
func SetProject(pro ...Project) {
var project Project
defaultPort := Project{
ServerAddr:"localhost",
Port: 80,
}
if len(pro) > 0 {
project = pro[0]
} else {
project = defaultPort
}
fmt.Println(project.ServerAddr, project.Port)
// other code here
}
返回命名
不带命名
func Add(a, b int) int {
return a + b
}
带命名
到了这里,关于深入理解与使用go之函数与方法--使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!