小白入门Go => 函数的基本认识与使用

Go函数

函数的基本认识

函数(function):每一个程序都包含很多的函数:函数是基本的代码块。

函数存在的目标:

  1. 对特定的、可复用的程序进行封装:
go 复制代码
package main

func main() {
    a,b := 1,2
    c,d := 3,4
    // res1 := a + b
    // res2 := c + d
    
    //a,b是实际参数(实参)
    res1 := plus(a,b)
    res2 := plus(c,d)
    
    println(res1,res2)
}

//加法函数,计算两数之和(函数更具备语义化)
func plus(num1 int,num2 int) int {
    res := num1 + num2
    return res
}
  1. 可编写强大的函数接口(后续章节介绍)

函数声明

1.具名函数声明: 只能出现在全局作用域,函数内部不能进行函数声明

  • func:函数声明关键字
  • main:函数名
  • ():形式参数(形参)容器
  • {}:函数体(装有函数逻辑)的容器
go 复制代码
package main

func main() {
    
}

2.函数表达式(匿名函数): 声明一个匿名函数赋值给一个变量,作为函数表达式

go 复制代码
test := func(){

}

函数具备一等公民的特征:

  1. 函数可以进行参数传递(回调特性)
go 复制代码
// cb => callback回调函数 => 函数参数
// func (a int, b int) int 
func test(cb func()){
    cb()
}

2.函数可以作为返回值抛出(闭包特性)

go 复制代码
func test2() func() {
    //函数内部定义的函数就是闭包函数
    a := 1
    //test函数能够访问test2函数的局部作用域
    //test函数捆绑在test2的作用域下,才形成了闭包
    test := func(){
        fmt.println("closure")
    }
    //返回test函数让外部调用
    return test
}

3.函数可以作为值进行变量赋值(值特性)

go 复制代码
func main() {
    //函数作为值赋给一个变量
    testFunc := test3
    testFunc()
}

func test3(){
    fmt.Println("test3")
}

4.函数可以实现接口(接口特性,后续章节介绍)

main函数:

  • main函数也是一个普通Go函数,可在任意地方调用执行
  • main函数是Go程序中的入口函数(自动执行一次)
  • main函数没有参数和返回值
go 复制代码
package main

func main() {
    fmt.Println("Hello World go!")
}

函数与作用域

  1. 作用域就是变量可访问的范围
  2. 作用域就是变量的容器
  3. main函数外有一个所有函数都能访问的作用域 - 全局作用域
  4. 每个函数内容是一个局部作用域(在函数内访问变量,函数内有的变量优先访问,不会访问函数外部同名变量)
  5. 函数作用域 => 可访问 => 外部作用域
  6. 函数内部也可以声明函数,函数作用域是可以嵌套的
  7. 函数内部只能定义函数表达式,不能进行函数声明
  8. 内部作用域可以访问外部作用域,但外部作用域是无法访问内部作用域的
go 复制代码
func test4(){
    //Go函数内部不允许函数声明
    //func goFunc(){
    // 
    //}
    goFunc := func(){
       fmt.Println("goFunc")
    }
    goFunc()
}
相关推荐
妙码生花2 天前
从 PHP 到 AI + Golang,程序员自救转型手记(八):设计管理员模型、热重载配置
前端·后端·go
tyung3 天前
Go 手写 Wait-Free MPSC 无界队列:SwapPointer 实现多生产者无锁入队
后端·go
陈明勇4 天前
Go 1.26 新特性回顾:语言增强、工具升级与 Green Tea GC 默认启用
后端·go
妙码生花4 天前
从 PHP 到 AI + Golang,程序员自救转型手记(二):目录结构、初始化 GIT、设计并开发配置系统
前端·后端·go
leeyi4 天前
Deer-Go:字节 Deer-Flow 的 Go 移植,深度研究 Agent 全拆解
go·aigc·agent
Bolt5 天前
TypeScript 7.0 来了:当 tsc 用 Go 重写之后
javascript·typescript·go
Go_error5 天前
Datatypes:Go 轻松支持数据库JSON类型
后端·go
任沫6 天前
Agent之Function Call
javascript·人工智能·go
唐青枫6 天前
别再把 interface 当万能盒子:Go 接口从隐式实现到项目解耦
go
tyung9 天前
Go 手写有界 SPSC 环形队列:无 CAS、无锁、Cache 友好的无锁模型
后端·go