go语言学习-函数

函数声明

函数声明包括函数名,形参列表,返回值列表(可选),函数体组成

func test(parameters) (returns) {
    // ...
}

其中 parameters 就是函数的形参列表,描述了函数的参数名和参数类型,可以没有参数但是这个括号不可以省略; returns就是返回值列表,描述了函数返回值的变量名(可选)和类型, 如果函数返回一个没有名字的参数或者没有返回值,就可以不要括号

这里的参数和返回值的类型都不能省略,不过可以简写(如果有的话)

例如:

func add(x int, y int) int {
    return x + y;
}

// 可以简写成
func add(x, y int) int {
    return x + y;
}

这里需要注意的是函数调用都必须按照声明顺序为所有的参数提供实参.并且Go语言的函数没有默认值,也不能通过参数名指定形参,因此形参和返回值的变量名对于函数调用者是没有用处的,只是在函数内部使用

参数的传递方式

如果实参是引用类型,如指针,slice,map,function,channel等类型,在函数内部进行修改,就会影响到传入的实参;

其他类型的实参是传递的是值的拷贝,对其修改不会影响函数外部。

变长参数

语法:

func test(x int, ns ...int) {
    //...
}

就是在参数类型前面加上三个点 “…”,这里需要注意的地方是这个变参本质上是一个slice,可在函数内部直接访问,并且一个函数只能有一个变长参数,并且只能在最后的位置

例如:

func add(x int, nums ...int) int {
    for i := range nums {
        x += nums[i]
    }
    return x
}

上面就是实现n个数的加法

同时在调用变参函数是,也可以将slice作为实参,不过需要展开,就是在slice后面加 “…”

调用方式:

add(10, 20, 30)  // 60

// 也可以使用slice
s := []int{10, 20, 40}
add(10, ...s)  // 80

多返回值

Go语言的函数支持多个返回值

func test() (int, int) {
    return 1, 2
}

此时就返回两个值,就需要有两个变量来接收,也可以使用 _ 接收来忽略某个参数

同时我们还可以为返回值起个名字

func test() (x int, y, int) {
    x = 10
    y = 10
    return
}

此时就可以使用return 隐式的返回参数了,会自动返回对应名字的参数,注意这里的返回值的名字不会影响函数外部.

匿名函数

go也支持匿名函数,可以直接赋值给变量,或者当做结构体的字段等

var add = func(x, y int) {
    return x + y;
}

// 然后就可以使用变量名调用
add(10, 20)  // 30

函数的特点总结

  • 函数声明包括函数名,形参列表,返回值列表(可选),函数体组成
  • 不支持参数默认值
  • 如果实参是引用类型,如指针,slice,map,function,channel等类型,进行修改,就回影响实参;
  • 其他类型的实参是传递的是值的拷贝,对其修改不会影响函数外部
  • 支持变长参数
  • 支持多返回值

原文地址:https://www.cnblogs.com/itogo/p/8645476.html

时间: 2024-07-31 08:01:06

go语言学习-函数的相关文章

C语言学习-函数和递归函数

C源程序是由函数组成的,有且只有一个主函数(main()函数). 一.函数 1.自定义函数的书写格式: 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…) { 函数体 }例如: 1 include <stdio.h> 2 void test(); 3 4 int main() { 5 test(); 6 return 0; 7 } 8 9 void test() { 10 11 printf("hello world!"); 12 13 } 2.定义函数的

R语言学习-函数

printLine <- function () { print("--------------------------------------------");} #函数的调用printLine(); #错误:无参函数,有参调用printLine("parameter"); printNLines <- function (n) { for(i in 1:n) { print("--------------------------------

黑马程序员——c语言学习心得——函数传递二维数组

黑马程序员——c语言学习心得——函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.   变量定义的时候给变量初始化,这是保证不出错的一个很好的习惯.尤其是在指针的使用上,如果我们没有给指针初始化,就会出现野指针,该指针的指向并不是我们所希望的,一旦错误的释放了这个指针,就会发生内存的访问.那么如何初始化指针变量呢,一般有以下几种方法:   1.初始化空指针   int* pInteger=N

【C语言学习】C语言中的函数

代码中,函数是为了更好的实现模块化的程序设计.那么函数的本质是什么?函数中定义的变量(全局变量.局部变量.静态变量等)又是怎样存储的?为什么全局变量与局部变量的作用域和生命期不相同?只有更加深入的了解函数,才能解答这些问题! ★函数的本质 函数的本质是一段可执行的机器指令代码,函数名的本质是一个标号,表示函数代码的入口.该标号的值等于内存中存储函数代码的内存空间的首地址. ★变量 ●全局变量 全局变量也就是外部变量,定义在函数的外部.因此它不属于任何一个函数,只属于所在的源文件. ▲初始化 对于

R语言——绘图函数深入学习

利用R自带数据集 通过data()函数可以查看R自带数据集. > data() 返回以下结果,每一条记录都是一个数据,键入相应的数据名称可以查看具体信息. Data sets in package ¡®datasets¡¯: AirPassengers Monthly Airline Passenger Numbers 1949-1960 BJsales Sales Data with Leading Indicator BJsales.lead (BJsales) Sales Data wit

R语言学习(4)-环境和函数

环境和函数 1.环境 使用new.env函数创建环境 > an_environment <- new.env() 向环境中分配变量与列表相同 > an_environment[["pythag"]] <- c(12,15,20,21) > an_environment$root <- polyroot(c(6,-5,1)) > assign("moonday",weekdays(as.Date("1969/07/2

【学习笔记】【C语言】函数

一. 什么是函数 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,你可以说C语言程序是由函数构成的. 比如你用C语言编写了一个MP3播放器程序,那么它的程序结构如下图所示: 二. 函数的定义 1. 定义函数的目的 将一个常用的功能封装起来,方便以后调用 2. 定义函数的步骤 函数名:函数叫什么名字 函数体:函数是干啥的,里面包含了什么代码 3. 格式 固定格式(很多语言的函数都是这么写的) 返回值类型 函数名(形式参数列

C语言学习019:函数指针

在C语言中,函数名也是指针变量,比如创建了一个add(int n,int m)的函数的同时也创建了一个名为add的指针变量,因此我们可以把函数指针当作一种类型为它赋值.当作参数传递等操作 C语言创建函数指针的公式: 返回类型 (*指针变量)(参数类型) 1 #include <stdio.h> 2 3 int add(int n,int m){ 4 return n+m; 5 } 6 7 int sub(int n,int m){ 8 return n-m; 9 } 10 11 int mai

go语言学习(五)——面向对象编程

主要讲的是"类"和接口&和其他传统语言不一样的地方挺多的,断断续续看了好几天 下面是我的练习代码 // GoStudy0219 project main.go /* go语言学习--面向对象编程(1) go中类型的值语义和引用语义 结构体(类)的定义和初始化 */ package main import ( "fmt" ) func main() { //几种"类"的初始化 v1 := &character{"Tom&q