Go之函数

news2024/11/23 8:57:11

一、函数基本使用

  一)函数概述

  1、函数定义

  对特定的功能进行提取,形成一个代码片段

  2、函数的作用

  提高代码的复用性,减少代码的冗余,代码的维护性也提高了

  3、函数中间的关系

  函数与函数是并列关系,所以定义的函数不能放到main函数中

  4、基本语法
func 函数名 (形参列表) (返回值类型列表) {
  执行语句
  return + 返回值列表  
}
  函数名
  • 遵循标识符命名规范:见明知意 addNum
  • 首字母不能是数字
  • 首字母大些 该函数可以被本包文件和其他包文件使用(类似public)
  • 首字母小写只能被本包文件使用,其他包文件不能使用(类似private)
  形参列表
  • 形参列表:可以一个参数,也可以是n个参数,可以是0个参数
  • 形式参数参数:作用,接收外来的数据
  • 实际参数:实际传入的数据
func calc(num1 int, num2 int) int {
    var sum int = 0
    sum += num1
    sum += num2
    return sum
}

func main() {
    sum := calc(10, 20)
    fmt.Println(sum)
}

  返回值类型列表

  返回值类型列表:返回的返回值对应的类型应该写在这个列表中

  • 返回0个:若没有返回值,那么返回值类型什么都不写就可以
func calc(num1 int, num2 int) { //若返回值类型就一个的话,那么()是可以省略不写的

    var sum int = 0
    sum += num1
    sum += num2
    //return sum
    fmt.Println(sum)
}

func main() {
    //功能
    //调用函数
    calc(10, 20)
    //fmt.Println(sum)
}
  • 返回1个:若返回值类型就一个的话,那么()是可以省略不写的
func calc(num1 int, num2 int) int { //若返回值类型就一个的话,那么()是可以省略不写的

    var sum int = 0
    sum += num1
    sum += num2
    return sum
    //fmt.Println(sum)
}

func main() {
    //功能
    //调用函数
    //calc(10, 20)
    sum := calc(10,20)
    fmt.Println(sum)
}

  • 返回多个
func calc2(num1 int, num2 int) (int, int) { //若返回值类型就一个的话,那么()是可以省略不写的

    var sum int = 0
    sum += num1
    sum += num2
    var result int = num1 - num2

    return sum, result
    //fmt.Println(sum)
}

func main() {
    //功能
    //调用函数
    //calc(10, 20)
    //sum := calc(10, 20)
    //fmt.Println(sum)
    sum1, result1 := calc2(30, 20)
    fmt.Println("sum1 is ", sum1)
    fmt.Println("result1 is ", result1)
}

  若有返回值不想接受,那么可以利用_进行忽略

  二)函数实战

  1、函数实现:两个数交换(内存分析)
  错误示例:下面的方式不能实现数字交换,执行交换函数前后结果相同

  单纯的值传递对函数外面的值没有影响

//自定义函数:交换两个数
func exchangeNum(num1 int, num2 int) {
    var t int
    t = num1
    num1 = num2
    num2 = t
}

func main() {
    //调用函数
    var num1 int = 10
    var num2 int = 20
    fmt.Printf("The two numbers before exchange: num1 = %v,num2 = %v\n", num1, num2)
    exchangeNum(num1, num2)
    fmt.Printf("The two numbers after exchange: num1 = %v,num2 = %v\n", num1, num2)
}

  

  正确做法:通过使用指针来进行数据的交换
//自定义函数:交换两个数
func exchangeNum(num1 *int, num2 *int) {
    t := *num1
    *num1 = *num2
    *num2 = t
}

func main() {
    //调用函数
    num1 := 10
    num2 := 20
    fmt.Printf("The two numbers before exchange: num1 = %v,num2 = %v\n", num1, num2)
    exchangeNum(&num1, &num2)
    fmt.Printf("The two numbers after exchange: num1 = %v,num2 = %v\n", num1, num2)
}

  输出结果如下

The two numbers before exchange: num1 = 10,num2 = 20
The two numbers after exchange: num1 = 20,num2 = 10

  2、golang函数不支持重载

  函数重载:不支持同时定义两个名字一样的函数

   3、支持可变参数(若希望函数带有可变数量的参数)
//定义一个函数,函数的参数为可变参数,参数的数量可变
//args...int 可以传入任意多(0-n)个数量的int类型的数据
func test(args ...int) {
    //函数内部处理可变参数时,将可变参数当做切片来处理
    //遍历可变函数:
    for i := 0; i < len(args); i++ {
        fmt.Println(args[i])
    }
}

func main() {
    test()
    fmt.Println("-------------------------------------------")
    test(8)
    fmt.Println("-------------------------------------------")
    test(1, 16, 168, 1688)
}

  输出结果

-------------------------------------------
8
-------------------------------------------
1
16
168
1688

  4、基本数据类型和数组默认都是值传递的,即进行拷贝。在函数内修改,不会影响到原来的值

  

  5、以值传递方式的数据类型,若希望在函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量

  6、函数也是一种数据类型,可以赋值给一个变量,则此变量就成为一个函数类型的变量了。通过改变量可以对函数调用。
package main

import "fmt"

//定义一个函数
func test(num int) {
    fmt.Println(num)
}

func main() {
    //函数也是一种数据类型,可以赋值给一个变量
    a := test //变量就是一个函数类型的变量
    fmt.Printf("a的类型是: %T, test函数的类型是: %T \n", a, test)
    //a的类型是:func(int),test的函数类型是func(int)

    //通过该变量可以对函数调用
    a(10)
}

  7、函数既然是一种数据类型,因此函数可以作为形参,并且可以调用
package main

import "fmt"

//定义一个函数
func test(num int) {
    fmt.Println(num)
}

func test02(num1 int, num2 float32, testFunc func(int)) {
    fmt.Println("-----test02")
}
func main() {
    //函数也是一种数据类型,可以赋值给一个变量
    a := test //变量就是一个函数类型的变量
    fmt.Printf("a的类型是: %T, test函数的类型是: %T \n", a, test)
    //a的类型是:func(int),test的函数类型是func(int)

    //通过该变量可以对函数调用
    a(10) //等价于 test(10)
    //调用test02函数
    test02(10, 3.19, test)
    test02(10, 3.19, a)
}

  8、为了简化数据类型定义,go支持自定义数据类型

  基本语法:type 自定义数据类型名 数据类型

  自定义数据类型相当于起个别名

  实战1

type myInt int ————>myInt就等价于int

  

func main() {
    //自定义数据类型:(相当于起别名)给int类型起了个别名叫myInt类型
    type myInt int
    var num1 myInt = 30
    fmt.Println("num1", num1)
    var num2 int = 30
    //num2 = num1  //虽然是别名,但是在go中编译识别时,还是认为myInt和int不是一种数据类型
    num2 = int(num1)
    fmt.Println("num2", num2)
}

  实战2

type mySum func(int, int) int ————>此时mySum就等价一个函数类型func(int, int) int

type myFunc func(int)
func test03(num1 int, num2 float32, testFunc myFunc) {
    fmt.Println("-----test03")
}

  9、支持函数返回值命名

  传统写法要求:返回值和返回值的类型对应,顺序不能差

func test04(num1 int, num2 int) (int, int) {
    result01 := num1 + num2
    result02 := num1 - num2
    return result01, result02
}

  升级写法:对函数返回值命名,里面顺序就无所谓了,顺序不用对应

//定义一个函数:求两个数的和、差
func test05(num1 int, num2 int) (sum int, sub int) {
    result02 := num1 - num2
    result01 := num1 + num2

    fmt.Println(result01, result02)
    return result02, result01
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2062131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Secure Coding in C and C ++ (四)局部静态构造函数 虚函数

前言 上一章节我们讲解了 关于C静态和指针与引用的部分 我们先来回顾一下相关的内容&#xff1a; 指针说白了就是地址&#xff0c; int a; int * ptr &a这里的整形指针 就是存放的整数变量的地址 静态 static 有两种层面&#xff1a; 第一种层面就是在其他的文件里&…

Ansys Zemax|如何自定义优化操作数

虽然Zemax OpticStudio有300多个内建优化操作数&#xff0c;但是还是会有一些特殊情况是这300多个操作数无法涵盖的。这就要求使用者根据要求计算出某些特定的数值&#xff0c;将这些数值返回到某个操作数&#xff0c;再对此操作数进行优化。 Zemax OpticStudio支持用户编程&a…

【SpringCloud】(一文通)多机部署, 负载均衡-LoadBalance

目 录 一. 负载均衡介绍1.2 什么是负载均衡1.3 负载均衡的⼀些实现 二. Spring Cloud LoadBalancer2.1 快速上手2.1.1 使用 Spring Cloud LoadBalancer 实现负载均衡2.1.2 启动多个product-service实例 2.2 负载均衡策略2.3 LoadBalancer 原理 三. 服务部署(Linux)3.2 服务构建…

(24)(24.4) MultiWii/DJI/HDZero OSD (version 4.2 and later)(一)

文章目录 前言 1 基于遥测的OSD 前言 ArduPilot 使用基于MSP&#xff08;MultiWii 串行协议&#xff09;的协议支持多种类型的屏幕显示&#xff08;OSD&#xff09;&#xff1a; 基于 MSP 遥测的操作系统&#xff0c;如大疆 FPV 护目镜 V1/V2、大疆护目镜 RE、FatShark Byte…

QML----QML+VTK+CMake示例

为了创建一个使用QML和VTK的示例项目,并使用CMake进行构建,将遵循以下步骤: 创建C++类以集成VTK和QML:这个类将负责设置VTK渲染数据,并与QML进行交互。设置CMake配置:配置CMake以找到并链接Qt和VTK库。创建QML界面:设计QML界面以显示VTK渲染的内容。编写主函数:初始化应…

C语言实现通讯录-动态版本与文件版本

C语言实现通讯录-动态版本与文件版本 1.前言2.动态版本2.1联系人信息之前的&#xff1a;改版: 2.2初始化之前的&#xff1a;改版&#xff1a; 2.3自动扩容 3.文件版本3.1自动保存函数实现&#xff1a;效果&#xff1a; 3.2打开时加载信息函数实现&#xff1a;效果&#xff1a; …

day37-https实战

1.知识点补充: 四层代理转发数据库 目的: 通过10.0.0.4 使用ssh远程连接到web01 ssh--->10.0.0.4:2222 ---------->172.16.1.7:22 xshell-->创建会话-->10.0.0.4 端口 2222 Linux系统 ssh 10.0.0.4 -p2222作业: 目的: 实现连接10.0.0.4的5555端口转发到后端数据库…

【hot100篇-python刷题记录】【只出现一次的数字】

R5-技巧篇 思路&#xff1a;使用哈希记录次数即可 class Solution:def singleNumber(self, nums: List[int]) -> int:dictdefaultdict(int)for num in nums:dict[num]1for num in nums:if dict[num]1:return num

【hot100篇-python刷题记录】【爬楼梯】

R5-真正的动态规划 动态规划核心&#xff1a; 第i步是怎么来的&#xff08;即动态规划公式&#xff09; 走到第i步阶梯的总方法数sum(走到第i-1步阶梯的总方法数&#xff0c;走到第i-2步阶梯的总方法数) class Solution:def climbStairs(self, n: int) -> int:if n<2:r…

云原生系列 - Nginx(高级篇)

前言 学习视频&#xff1a;尚硅谷Nginx教程&#xff08;亿级流量nginx架构设计&#xff09;本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删学习文档&#xff1a; 云原生系列 - Nginx(基础篇)云原生系列 - Nginx(高级篇) 一、扩容 通过扩容提升整体吞吐量…

OpenCV resize 的各插值方式的区别与用途

一、resize 函数中 interpolation 参数的区别和用途 cv2.resize 函数中的 interpolation 参数用于指定图像缩放时使用的插值方法。不同的插值方法会影响缩放后图像的质量和处理速度。以下是cv2.INTER_AREA、cv2.INTER_CUBIC、cv2.INTER_NEAREST、cv2.INTER_LINEAR 和 cv2.INTE…

有关应用层面试题有关库的思维导体

面试题目&#xff1a; TCP通信中3次握手和四次挥手&#xff1f; 答&#xff1a; 第一次握手&#xff1a;客户端发送SYN包&#xff08;SYN1, seq0&#xff09;给服务器&#xff0c;并进入SYN_SENT状态&#xff0c;等待服务器返回确认包。第二次握手&#xff1a;服务器接收到S…

什么是Redis大key问题?如何解决?

目录 Key多大算大呢&#xff1f; 识别big key 处理big key Big Key是Redis中存储了大量的数据的Key&#xff0c;不要误以为big key只是表示Key的值很大&#xff0c;他还包括这个Key对应的value占用空间很多的情况&#xff0c;通常在String、list、hash、set、zset等类型中出…

三、Socket多路复用介绍

一、Socket连接方式 二、多路复用 三、Socket连接包含的内容

搭建TestBench,收藏这几条基本框架就够了

Verilog功能模块HDL设计完成后&#xff0c;并不代表设计工作的结束&#xff0c;还需要对设计进行进一步的仿真验证。掌握验证的方法&#xff0c;即如何调试自己的程序非常重要。在RTL逻辑设计中&#xff0c;要学会根据硬件逻辑来写测试程序即写Testbench。Verilog测试平台是一个…

MATLAB中qr函数用法

目录 语法 说明 示例 Q-Less QR 分解 矩阵的完整 QR 分解 置换 QR 分解 用精简 QR 因子求解线性系统 求解稀疏线性系统 求解矩形稀疏线性系统 提示 qr函数的功能是对矩阵进行QR 分解。 语法 R qr(A) [Q,R] qr(A) [Q,R,P] qr(A) [___] qr(A,"econ") […

sklearn转换器和估计器

转换器 实例化一个转换器类 调用fit_transform() 转换器调用有以下几种形式&#xff1a; fit_transform fit transform估计器&#xff08;sklearn机器学习算法的实现&#xff09; 在sklearn中&#xff0c;估计器是一个重要的角色&#xff0c;是一类实现了算法的API 1、用于…

深入理解 C# 中的 dynamic 类型详解与示例

文章目录 1. 什么是 dynamic 类型&#xff1f;2. dynamic 的工作原理3. dynamic 类型的使用4. 使用 dynamic 的场景5. dynamic 的优缺点6. dynamic 类型的注意事项7. 总结 在 C# 编程中&#xff0c;dynamic 类型是一个非常特殊的类型&#xff0c;它在编译时并不会进行类型检查&…

TCP协议中的建立连接机制

目录 客户端与服务器间的三次握手 1、关于SYN_RCVD状态 2、关于系统调用listen的第二个参数 3、为什么服务端操作系统内核中的全连接队列不能太长&#xff1f; 4、服务端操作系统内核中可以没有全连接队列&#xff1f; 客户端与服务器间的三次握手 要想成功创建连接需要客…

【Docker深入浅出】Docker镜像

文章目录 一. Docker镜像简介二. Docker镜像详解1. 镜像和容器的关系2. 镜像通常比较小3. 拉取镜像4. 镜像命名4.1. 镜像仓库服务4.2. 官方和非官方镜像仓库4.3. 镜像的命名和标签 5. 为镜像打多个标签6. 过滤镜像内容6.1. 虚空镜像6.2. 删除虚空镜像6.3. 过滤器与格式化输出 7…