细节汇总

  1. 函数的形参列表可以是多个,返回值列表也可以是多个
  2. 形参列表和返回值列表的数据类型,可以是值类型、也可以是引用类型
  3. 函数的命名遵循标识符命名规范,首字母不能是数字,首字母大写表示该函数可以被本包文件和其它文件使用,类似public;首字母小写只能被本包文件使用,类似private。
  4. 函数中的变量是局部的,外部不能访问。作用域
  5. 基本数据类型和数组都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值,
  6. 如果希望函数内的变量能够修改函数外的变量,可以传入变量的地址(&),函数内以指针的方式操作变量,从效果上看类似引用
  7. Go函数不支持函数重载。
  8. 在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量是一个函数类型的变量,通过该变量可以对函数调用。
  9. 函数既然是一种数据类型,因此在Go中,函数也可以作为形参,并且调用。(回调函数
  10. 为了简化数据类型定义,Go支持自定义数据类型
  • 语法: type 自定数据类型名 数据类型 (相当于一个别名)

  • 案例: type myInt int 这时,myInt就等价于int来使用了

  • type mySum func(int, int) int 这时,mySum就等价于func(int, int) int

  1. 支持对函数返回值命名(可以不受返回值顺序限制
  2. 使用 _ 下划线标识符,忽略返回值。(占位符
  3. Go支持可变参数

值传递和指针传递

func test(n1 int) {
n1 = n1 + 10
fmt.Println("test n1=", n1)
} // 指针类型接收处理
func test02(n2 *int) {
*n2 = *n2 + 10
fmt.Println("test02 n2=", *n2)
} func main() {
n1 := 20
n2 := 2
test(n1) // 值类型
test02(&n2) // 指针类型
fmt.Println("main n1=", n1)
fmt.Println("main n2=", n2)
}

什么是重载

重载: 函数名相同,但是形参不同或者数据类型不同的情况。

Golang语言中是不支持传统的函数重载的,fn redeclared in this block

Golang语言是支持可变参数的,空接口的形式

函数类型的变量

类型: func(int, int) int

func getSum(n1 int, n2 int) int {
return n1 + n2
}
func getSums(n1 int, n2 int, n3 int) int {
return n1 + n2 + n3
} // main 函数
sumFn := getSum
res := sumFn(10, 20)
fmt.Printf("%T %v\n", res, res) // int 30
fmt.Printf("%T \n", sumFn) // func(int, int) int sumsFn := getSums
result := sumsFn(10, 20, 30)
fmt.Printf("result : %T %v\n", result, result) // result : int 60
fmt.Printf("sumsFn类型:%T \n", sumFn) // sumsFn类型:func(int, int) int

函数作为形参传入

func getSum(n1 int, n2 int) int {
return n1 + n2
}
func testFn(fnVar func(int, int) int, num1 int, num2 int) int {
return fnVar(num1, num2) // 调用传入的函数,并返回值
} // 函数类型形参
sumFn := getSum
total := testFn(sumFn, 1, 2)
fmt.Println("total=", total) // 3

自定义数据类型

  1. 自定义函数数据类型, 相当于起了一个别名
type mySum func(int, int) int

func testFn(fnVar mySum, num1 int, num2 int) int {
return fnVar(num1, num2)
} // func testFn(fnVar func(int, int) int, num1 int, num2 int) int {
// return fnVar(num1, num2)
// }
  1. 自定义数据类型
// main函数下
type myInt int
var num1 myInt = 2
// var num2 int = num1 // 这样是报错的, myInt和int并不等价
var num2 int = int(num1) // 显式类型转换
fmt.Printf("num1的类型:%T 值:%v \n", num1, num1) // num1的类型:main.myInt 值:2
fmt.Printf("num2的类型:%T 值:%v \n", num2, num2) // num2的类型:int 值:2
  1. 定义的类型: 包名.类型名,如:utils.myInt
// 以下是utils包
package utils import "fmt" func TestFn() string {
fmt.Println("TestFn 函数被调用")
type myInt int
var n myInt = 10
fmt.Printf("n的类型:%T 值:%v", n, n) // n的类型:utils.myInt 值:10
return "hahaha"
}

返回值命名

func sumSub(n1 int, n2 int) (sum int, sub int) {
// 这里不需要声明sum, sub变量了,也不用在return时写
sum = n1 + n2
sub = n1 - n2
return
} // main函数
sum, sub := sumSub(9, 8)
fmt.Println("sum=", sum, "sub=", sub) // sum= 17 sub= 1

可变参数

基本语法

  1. 支持零到多个参数

func sum(args... int) {}

  1. 支持1到多个参数

func sum(n1 int, args... int) {}

args:就是一个承接的变量名,可以自定义,如:func sum(n1 int, **vars**... int) {}

说明:

  • args是slice切片,通过args[index]可以访问到各个值
  • args必须放到形参列表的最后面

参数个数可变

func sumV2(n1 int, args ...int) int {
sum := n1
fmt.Printf("args类型是:%T\n", args) // args类型是:[]int
// 遍历args切片
for i := 0; i < len(args); i++ {
sum += args[i]
}
return sum
} // main函数
// 参数可变
total02 := sumV2(1, 2, 3, 4)
fmt.Println("total02=", total02) // total02= 10

总结练习

交换变量a, b的值

package main

import "fmt"

func swap(n1 *int, n2 *int) {
*n1 = *n1 + *n2
*n2 = *n1 - *n2 // *n1
*n1 = *n1 - *n2 // *n2
} func main() {
a := 12
b := 20
swap(&a, &b)
fmt.Println("a = ", a, "b = ", b)
}

我是 甜点cc

微信公众号:【看见另一种可能】

热爱前端开发,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚。本号主要致力于分享个人经验总结,希望可以给一小部分人一些微小帮助。

希望能和大家一起努力营造一个良好的学习氛围,为了个人和家庭、为了我国的互联网物联网技术、数字化转型、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。

Go | 函数注意事项的更多相关文章

  1. js foreach函数 注意事项(break、continue)

    foreach API说明: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Arra ...

  2. js自执行函数注意事项

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. c++虚函数注意事项

    >在基类方法声明中使用关键字virtual,可以使该方法在基类及所有的派生类中是虚的 >如果使用指向对象的引用或指针来调用虚方法,程序将使用对象类型定义的方法,而不使用为引用或指针类型定义 ...

  4. OpenCV中cvWaitKey()函数注意事项

    注意:这个函数是HighGUI中唯一能够获取和操作事件的函数,所以在一般的事件处理中,它需要周期地被调用,除非HighGUI被用在某些能够处理事件的环境中.比如在MFC环境下,这个函数不起作用.

  5. 内联汇编和JMP到内联函数注意事项

    对于jmp类型的hook, 如果自己的过程没有使用_declspec(naked),那么系统会自动给添加一些额外的代码,控制堆栈平衡,但是这些额外的代码会破坏被hook函数的堆栈. 对于call类型的 ...

  6. MySqL触发器以及常用转换函数注意事项

    1,触发器(http://www.cnblogs.com/zzwlovegfj/archive/2012/07/04/2576989.html)       1.MYSQL中触发器中不能对本表进行 i ...

  7. PLSQL 创建自定义函数注意事项

    2017-6-8周四,今天遇到的需求是,从数据库中查找出某张表的某些数据,并将这些数据做简单的加减运算再得到结果集,没有思路,后来问辉哥,给我的建议是给这些运算封装成一个SQL函数,select选择字 ...

  8. js- DOM事件之按钮绑定函数注意事项

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  9. c++默认参数函数注意事项

    再有默认参数的函数中,一般我们都把默认参数放在声明处而不是定义处. 如果声明和定义都有默认参数,编译器将会报错. 调用含有默认实参的函数时,我们可以包含参数,也可以省略. 有默认参数的函数,我们可以不 ...

  10. Excel使用SUMIF函数注意事项

    sumif函数的公式使用方法如下: =sumif(查询匹配的区域,条件,汇总求和的区域) 条件可以是“>10”或"=10"这种格式.其中“查询匹配区域”和“汇总求和区域”需要 ...

随机推荐

  1. Awvs+nessus docker版本

    awvs-nessus 拉取镜像 docker pull leishianquan/awvs-nessus:v2 启动 docker run --name awvs-nessus -it -d -p ...

  2. 第一篇博客:HTML:background的使用

    开篇 我是一名程序员小白,这是我写的第一篇博客,在学习的路上难免会遇到难以解决的问题,我将会在这里写下我遇到的问题并附上解决方法 希望可以对各位有所帮助!! 我们在html中经常会遇到这样的问题 例如 ...

  3. Windows 2012 R2上搭建IIS管理用户的隔离模式FTP

    Windows 2012 R2上搭建IIS管理用户的隔离模式FTP Windows自带的FTP现在可以提供基于非OS用户的管理,这提高了安全性.即使FTP用户名和密码泄露,也不会对操作系统造成进一步的 ...

  4. python自动更新pom文件

    前言 项目越来越多,版本管理越来越麻烦,在项目上我使用 maven version 来进行版本管理.主要还是在分布式项目中模块众多的场景中使用,毕竟各个模块对外的版本需要保持统一. 关于这个插件如何使 ...

  5. 延申三大问题中的第三个问题处理---发布更新时先把服务从注册中心给down下来,等待一段时间后再能更新模块

    一开始采取的思路大致如下: 在preStop中使用/bin/sh命令,先down 然后sleep一段时间, 这种思路的执行情况如下: 假若升级容器使用的镜像版本的话,先执行preStop中的命令,sl ...

  6. Gitlab基础知识介绍

    GitLab架构图 Gitlab各组件作用 -Nginx:静态web服务器. -gitlab-shell:用于处理Git命令和修改authorized keys列表. -gitlab-workhors ...

  7. 前端ES6 面试过关宝典

    ES6 部分 Typescript 部分 前端工程面经(节流防抖.https.前端攻击.性能优化...) https://juejin.cn/post/6844903734464495623 ES6面 ...

  8. DeepHyperX代码理解-HamidaEtAl

    代码复现自论文<3-D Deep Learning Approach for Remote Sensing Image Classification> 先对部分基础知识做一些整理: 一.局 ...

  9. 我的 Kafka 旅程 - broker

    broker在kafka的服务端运行,一台服务器相当于一个broker:每个broker下可以有多个topic,每个topic可以有多个partition,在producer端可以对消息进行分区,每个 ...

  10. python实验报告(第五周)

    一.实验目的和要求 学会使用字符串的常用操作方法和正确应用正则表达式. 二.实验环境 软件版本:Python 3.10 64_bit 三.实验过程 1.实例1:使用字符串拼接输出一个关于程序员的笑话 ...