首页 > 其他分享 >go基础-7.函数和指针

go基础-7.函数和指针

时间:2024-09-24 11:03:55浏览次数:1  
标签:函数 int fmt Println num func go main 指针

函数是一段封装了特定功能的可重用代码块,用于执行特定的任务或计算

函数接受输入(参数)并产生输出(返回值)

函数定义

package main

import "fmt"

// 使用func关键字定义一个函数
func sayHello() {
  fmt.Println("hello")
}

func main() {
  // 函数()调用函数
  sayHello()
}

函数参数

package main

import "fmt"

func add(n1 int, n2 int) {
  fmt.Println(n1, n2)
}

// 参数类型一样,可以合并在一起
func add1(n1, n2 int) {
  fmt.Println(n1, n2)
}

// 多个参数
func add2(numList ...int) {
  fmt.Println(numList)
}

func main() {
  add(1, 2)
  add1(1, 2)
  add2(1, 2)
  add2(1, 2, 3, 4)
}

函数返回值

package main

import "errors"

// 无返回值
func fun1() {
  return // 也可以不写
}

// 单返回值
func fun2() int {
  return 1
}

// 多返回值
func fun3() (int, error) {
  return 0, errors.New("错误")
}

// 命名返回值
func fun4() (res string) {
  return // 相当于先定义再赋值
  //return "abc"
}

func main() {

}

匿名函数

package main

import "fmt"

func main() {
  var add = func(a, b int) int {
    return a + b
  }
  fmt.Println(add(1, 2))
}

高阶函数

根据用户输入的不同,执行不同的操作

package main

import "fmt"

func main() {
  fmt.Println("请输入要执行的操作:")
  fmt.Println(`1:登录
2:个人中心
3:注销`)
  var num int
  fmt.Scan(&num)
  var funcMap = map[int]func(){
    1: func() {
      fmt.Println("登录")
    },
    2: func() {
      fmt.Println("个人中心")
    },
    3: func() {
      fmt.Println("注销")
    },
  }
  funcMap[num]()
}

提取出来

package main

import "fmt"

func login() {
  fmt.Println("登录")
}

func userCenter() {
  fmt.Println("个人中心")
}

func logout() {
  fmt.Println("注销")
}

func main() {
  fmt.Println("请输入要执行的操作:")
  fmt.Println(`1:登录
2:个人中心
3:注销`)
  var num int
  fmt.Scan(&num)
  var funcMap = map[int]func(){
    1: login,
    2: userCenter,
    3: logout,
  }
  funcMap[num]()
}

闭包

设计一个函数,先传一个参数表示延时,后面再次传参数就是将参数求和

例如

fun(2)(1,2,3) // 延时2秒求1+2+3
package main

import (
  "fmt"
  "time"
)

func awaitAdd(t int) func(...int) int {
  time.Sleep(time.Duration(t) * time.Second)
  return func(numList ...int) int {
    var sum int
    for _, i2 := range numList {
      sum += i2
    }
    return sum
  }
}

func main() {
  fmt.Println(awaitAdd(2)(1, 2, 3))
}

值传递和引用传递

稍微了解过编程的都应该知道,计算机上显示的所有的数据都是在内存里面的

也就是说,我们定义的一个变量,它也在内存里面有一块地

正常情况下来说,函数的参数是将之前那块地复制了一份出来

如何证明呢

package main

import "fmt"

func add(num int) {
  fmt.Println(&num) // 可以看到,这个n的内存地址和外面num的内存地址是明显不一样的
  num = 2           // 这里的修改不会影响外面的num
}

func main() {
  num := 20
  fmt.Println(&num)
  add(num)
  fmt.Println(num) // 20
}


也就是说,在函数里面不管怎么修改这个参数,都不会影响原来的那个值

但是,如果我需要在函数体内修改变量的值呢?

这就需要用到引用传递了

我们直接将变量的内存地址传递进去

package main

import "fmt"

func add(num *int) {
  fmt.Println(num) // 内存值是一样的
  *num = 2         // 这里的修改会影响外面的num
}

func main() {
  num := 20
  fmt.Println(&num)
  add(&num)
  fmt.Println(num) // 成功修改 2
}

指针

上面那个案例搞清楚之后,指针也就不难了

我们只需要知道

&是取地址,*是解引用,去这个地址指向的值

参考文档

函数 https://zhuanlan.zhihu.com/p/635927865

指针 https://c.biancheng.net/view/21.html

go语言函数 https://blog.csdn.net/weixin_44211968/article/details/121295530

标签:函数,int,fmt,Println,num,func,go,main,指针
From: https://www.cnblogs.com/fengfengzhidao/p/18428722

相关文章

  • go基础-6.for循环
    任何编程语言,都会有for循环,它的一般写法是for初始化;条件;操作{}例如求1+2+...+100的和packagemainimport"fmt"funcmain(){varsum=0fori:=0;i<=100;i++{sum+=i}fmt.Println(sum)}for循环的五种变体传统for循环如上死循环每......
  • go基础-8.init函数和defer函数
    init函数init()函数是一个特殊的函数,存在以下特性:不能被其他函数调用,而是在main函数执行之前,自动被调用init函数不能作为参数传入不能有传入参数和返回值一个go文件可以有多个init函数,谁在前面谁就先执行packagemainimport"fmt"funcinit(){fmt.Println("init1"......
  • go基础-11.接口
    接口是一组仅包含方法名、参数、返回值的未具体实现的方法的集合packagemainimport"fmt"//Animal定义一个animal的接口,它有唱,跳,rap的方法typeAnimalinterface{sing()jump()rap()}//Chicken需要全部实现这些接口typeChickenstruct{Namestring}......
  • go基础-10.自定义数据类型
    在Go语言中,自定义类型指的是使用type关键字定义的新类型,它可以是基本类型的别名,也可以是结构体、函数等组合而成的新类型。自定义类型可以帮助我们更好地抽象和封装数据,让代码更加易读、易懂、易维护自定义类型结构体就是自定义类型中的一种除此之外我们使用自定义类型,还可......
  • Lambda函数
    C++中的Lambda函数在C++11及以后版本中,Lambda函数(或称为匿名函数)是一种内联函数,可以在函数内部或任何其他地方定义,甚至可以立即传递给其他函数。Lambda函数的语法更加灵活,允许捕获变量和处理复杂的行为,非常适合在需要简单函数的场景中使用。语法[capture](parameters)->r......
  • 传奇微端黑屏不更新地图?传奇微端架设教程——GOM引擎
    登录器和网站配置好后,我们进入游戏后会发现是黑屏的,更新不了地图和NPC这些,因为还没有做微端,会黑屏也是正常的。有些老G做了微端但是还是黑屏,就可能是你的微端架设出现了问题,可以参考以下教程。gom引擎的版本在版本文件夹里一般都放着一份微端服务器的压缩包,如果是版本文件夹......
  • 【开题报告】基于django+vue宿舍管理系统(论文+程序)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高校规模的不断扩大和学生人数的持续增长,宿舍管理成为了高校日常管理中的一项重要且复杂的任务。传统的宿舍管理模式往往依赖于人工记......
  • Google 提供基于AI的模糊测试框架
    人工智能驱动的OSS-Fuzz工具可以帮助发现漏洞,并与自动修补管道相结合。    模糊测试可以成为找出软件中零日漏洞的宝贵工具。为了鼓励开发人员和研究人员使用它,谷歌周三宣布,免费提供其模糊测试框架OSS-Fuzz。    根据谷歌的说法,通过使用该框架在大型语言......
  • 在 Go 语言中使用 Redis 实现分布式锁
    目录在Go语言中使用Redis实现分布式锁一、分布式锁的概念和作用二、Redis实现分布式锁的原理三、在Go语言中使用Redis实现分布式锁的步骤(一)安装Redis客户端库(二)定义分布式锁结构体(三)实现获取锁的方法(四)实现释放锁的方法(五)使用分布式锁四、注意事项五、总......
  • .net core 使用QRCoder在linux 下生成带logo的二维码
    1使用nuget安装QRCoder、SkiaSharp、SkiaSharp.NativeAssets.Linux.NoDependenciespublicIActionResultQrCode(stringcontent,intpixel){content=HttpUtility.UrlDecode(content);stringlogoPath=Path.Combine(AppContext.BaseDirectory,"wwwroot"......