头图

Golang 基础之函数使用 (一)

大家好,今天将梳理出的 Go语言函数用法内容,分享给大家。 请多多指教,谢谢。

本次《Go语言函数使用》内容共分为三个章节,本文为第一章节。

  • Golang 基础之函数使用 (一)
  • Golang 基础之函数使用 (二)
  • Golang 基础之函数使用 (三)

本章节内容

  • 函数介绍
  • 函数特点
  • 函数声明
  • 传参方式
  • 不定参数传值
  • 任意参数类型的不定参数
  • 返回值

函数介绍

为了完成某一功能的程序指令(语句)的集合,称为函数。

Go 语言的函数可以分为:自定义函数和系统函数。Go 语言函数与其他语言函数最大的不同是,Go 语言的函数可以支持返回任意多个值,而其他语言的函数一般只支持返回一个值。

比如C语言函数返回值只能是一种类型。

Go 语言的函数也支持普通函数、匿名函数和闭包三种形式。

函数特点

  • 无需声明原型
  • 支持不定变参
  • 支持多返回值
  • 支持命名返回参数
  • 支持匿名函数和闭包 (变向的高阶函数)
  • 函数也是一种类型,一个函数可以赋值给变量
  • 不支持嵌套 (nested) 一个包不能有两个名字一样的函数
  • 不支持重载 (overload)
  • 不支持默认参数 (default parameter)

函数声明

函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。

func name(parameter-list) (result-list) {   // 声明函数名
  // 函数体
}

如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的。如果一个函数声明不包括返回值列表,那么函数体执行完毕后,不会返回任何值。

传参方式

值传递

指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

func num(x, y int) int {
       // 处理逻辑
}

引用传递

是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

func swap(x, y *int) {
    var temp int

    temp = *x /* 保存 x 的值 */
    *x = *y   /* 将 y 值赋给 x */
    *y = temp /* 将 temp 值赋给 y*/
}

无论是值传递,还是引用传递,传递给函数的都是变量的副本,不过,值传递是值的拷贝。

引用传递是地址的拷贝,一般来说,地址拷贝更为高效。而值拷贝取决于拷贝的对象大小,对象越大,则性能越低。

map、slice、chan、指针、interface默认以引用的方式传递。

不定参数传值

函数的参数不是固定,后面的类型是固定的。 (可变参数)

golang可变参数本质上就是slice。

在参数赋值时可以不用一一的赋值,可以直接传递一个数组或者切片,注意在参数后加上 即可。

func myfunc(args ...int) {    //0个或多个参数
}

func add(a int, args ...int) int {    //1个或多个参数
}

func add(a int, b int, args ...int) int {    //2个或多个参数
}
其中args是一个slice类型,我们可以通过 arg[index] 依次访问所有参数,通过 len(arg) 来判断传递参数的个数。

使用slice对象做变参时,必须展开。

package main

import (
    "fmt"
)

func sum(s string, n ...int) string {
    var x int
    for _, i := range n {
        x += i
    }
    return fmt.Sprintf(s, x) // 字符串拼接
}

func main() {
    s := []int{1, 2, 3}
    res := sum("sum: %d", s...)    // slice... 展开slice
    println(res)
}

输出结果

sum: 6

任意类型的不定参数

函数的参数和每个参数的类型都不是固定的。

interface{} 传递任意类型数据是Go语言的惯例用法,而且 interface{} 的类型是安全的。

func myfunc(args ...interface{}){ // 示例用法
  ...
}

返回值

_ 标识符,用来忽略函数的某个返回值。

Go 的返回值可以被命名, 返回值的名称应当具有一定意义。

没有参数的 return 语句返回各个返回变量的当前值,这种用法被称作“裸”返回。
func myfunc(arg int) (arg int) { // 示例用法
   return arg
}

技术文章持续更新,请大家多多关注呀~~

搜索微信公众号【 帽儿山的枪手 】,关注我

短-白底-小文件.png


Golang从小白到大神
分享Golang语言技术交流
46 声望
12 粉丝
0 条评论
推荐阅读
Golang 基础之并发知识 (三)
大家好,今天将梳理出的 Go语言并发知识内容,分享给大家。 请多多指教,谢谢。本次《Go语言并发知识》内容共分为三个章节,本文为第三章节。Golang 基础之并发知识 (一)Golang 基础之并发知识 (二)Golang 基础之...

帽儿山的枪手1阅读 826

封面图
从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木75阅读 7.1k评论 16

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木45阅读 8.5k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木35阅读 6.7k评论 10

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go33阅读 2.4k评论 1

封面图
从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木34阅读 5k评论 9

从零搭建 Node.js 企业级 Web 服务器(十三):断点调试与性能分析
Node.js 官方提供了断点调试机制,出于安全性考虑默认为关闭状态,可以通过 node 参数 --inspect 或 --inspect-brk 开启,配合 IDE 能够非常方便地调试代码,本章就上一章已完成的项目 licg9999/nodejs-server-ex...

乌柏木31阅读 4.2k评论 9

46 声望
12 粉丝
宣传栏