首页 > 其他分享 >Go 快速入门指南 - 变长参数和指针参数

Go 快速入门指南 - 变长参数和指针参数

时间:2022-12-22 16:34:59浏览次数:58  
标签:int fmt 参数 numbers func Go main 指针

变长参数

在函数的最后一个参数的数据类型之前加上省略号 ... ,表示该参数的数据类型是 变长类型, 调用该函数时可以传递任意数量 ( 0 - N ) 的该类型的参数。

一个函数只能有一个变长参数,且变长参数必须为最后一个参数

例子

传递一个参数

package main

import "fmt"

func sum(numbers ...int) int {
    total := 0
    for _, num := range numbers {
        total += num
    }
    return total
}

func main() {
    fmt.Printf("1 = %d\n", sum(1))
}

// $ go run main.go
// 输出如下 
/**
  1 = 1
*/

传递多个参数

package main

import "fmt"

func sum(numbers ...int) int {
    total := 0
    for _, num := range numbers {
        total += num
    }
    return total
}

func main() {
    fmt.Printf("1 + 2 + 3 = %d\n", sum(1, 2, 3))
}

// $ go run main.go
// 输出如下 
/**
  1 + 2 + 3 = 6
*/

传递切片参数

如果要传递 切片类型 数据作为函数参数,只需要在参数后面加上省略号 ...

package main

import "fmt"

func sum(numbers ...int) int {
    total := 0
    for _, num := range numbers {
        total += num
    }
    return total
}

func main() {
    numbers := []int{1, 2, 3}
    fmt.Printf("1 + 2 + 3 = %d\n", sum(numbers...)) // 切片变量后面加 ... 即可
}

// $ go run main.go
// 输出如下 
/**
  1 + 2 + 3 = 6
*/

不传递任何参数

package main

import "fmt"

func sum(numbers ...int) int {
    total := 0
    for _, num := range numbers {
        total += num
    }
    return total
}

func main() {
    fmt.Printf("不传递任何参数 = %d\n", sum())
}

// $ go run main.go
// 输出如下 
/**
  不传递任何参数 = 0
*/

指针参数

建议先阅读 指针 小节。

例子

指针变量参数

package main

import "fmt"

func double(n int) {
    n *= 2
}

func doubleWithPtr(n *int) {
    *n *= 2
}

func main() {
    n := 100

    double(n)
    fmt.Printf("使用普通变量作为函数参数执行完成后, n = %d\n", n) // 可以看到,变量值并未发生变化

    doubleWithPtr(&n)
    fmt.Printf("使用指针变量作为函数参数执行完成后, n = %d\n", n) // 变量值已经发生变化
}

// $ go run main.go
// 输出如下 
/**
  使用普通变量作为函数参数执行完成后, n = 100
  使用指针变量作为函数参数执行完成后, n = 200
*/

指针数组变量参数

package main

import "fmt"

func double(numbers [3]int) {
    for _, v := range numbers {
        v *= 2
    }
}

func doubleWithPtr(numbers *[3]int) {
    for i := range numbers {
        numbers[i] *= 2
    }
}

func main() {
    numbers := [3]int{100, 200, 300}

    double(numbers)
    fmt.Printf("使用数组变量作为函数参数执行完成后, n = %d\n", numbers) // 可以看到,数组元素并未发生变化

    doubleWithPtr(&numbers)
    fmt.Printf("使用指针数组变量作为函数参数执行完成后, n = %d\n", numbers) // 数组元素已经发生变化
}

// $ go run main.go
// 输出如下 
/**
  使用数组变量作为函数参数执行完成后, n = [100 200 300]
  使用指针数组变量作为函数参数执行完成后, n = [200 400 600]
*/

切片参数

在 切片 小节中讲到,切片的底层引用了一个数组,可以简单地理解为:切片本身是一个指针,指向底层数组的元素, 所以常用的方式的是将函数参数定义为切片类型。

package main

import "fmt"

func double(numbers []int) {
    for i := range numbers {
        numbers[i] *= 2
    }
}

func main() {
    numbers := []int{100, 200, 300}

    double(numbers)
    fmt.Printf("使用切片变量作为函数参数执行完成后, n = %d\n", numbers) // 切片元素已经发生变化
}

// $ go run main.go
// 输出如下 
/**
  使用切片变量作为函数参数执行完成后, n = [200 400 600]
*/

小结

默认情况下,Go 的函数参数传递方式使用 值传递,也就是说,修改参数的值不会影响到 原变量, 如果希望修改参数的同时修改 原变量,需要传递变量的引用 (指针)。

对于基础数据类型 (如 int, float, bool 等),需要传递值的地址,对于已经是 引用类型 的数据类型 (如切片、通道等),直接传递值即可。

联系我

公众号

标签:int,fmt,参数,numbers,func,Go,main,指针
From: https://www.cnblogs.com/duanbiaowu/p/16998838.html

相关文章

  • Go 快速入门指南 - defer 函数
    概述一个 defer 语句就是一个普通的函数或方法调用。 defer 语句保证了不论是在正常情况下(return返回),还是非正常情况下(发生错误,程序终止),函数或方法都能够执......
  • (笔记)伺服电机三环(电流环、速度环、位置环)控制原理及参数调节
     运动伺服一般都是三环控制系统,从内到外依次是电流环、速度环、位置环。  一、理解三环1、电流环电流环的输入是速度环PID调节后的输出,我们称为“电流环给定”吧......
  • django中间件三个了解的方法、 基于django中间件的功能设计、 cookie与session简介、
    目录django中间件三个了解的方法基于django中间件的功能设计cookie与session简介django操作cookiedjango操作cookiedjango操作sessiondjango中间件三个了解的方法1.proc......
  • GOCVHelper图像处理算法库实例整编
       GOCVHelper主要包含图像处理、图像增强和基础文件处理三个部分。由于前两个部分较具有通用性,而且我在不同项目中都进行了反复使用,为了进一步说明类库内容,这里反过来......
  • Go 快速入门指南 - 环境安装
    概述为了节省篇幅,笔者将常用的3种操作系统对应的安装教程汇总到了一起,读者可以直接选择对应内容阅读。Windows环境搭建下载1. 打开Go官网下载地址(https://go.......
  • Go-18 Golang结构体struct详解
    packagemainimport"fmt"//Golang中的结构体详解typenewIntint//自定义类型typemyInt=int//类型别名typezsIntinttypepersonstruct{ namestr......
  • 将GOCVHelper推向opencv——关于thinning函数的探索
      所以第一步就是opencvopencv_contrib联合起来。通过gitee来下载,速度非常快。https://gitee.com/mirrors/opencv_contrib/repository/archive/master.zip 配置......
  • 升级版本后,报错go: -i flag is deprecated
    环境 goversiongo1.18.6升级go版本后,本地项目起不来 将-i去掉应用,在重启,则正常启动 ......
  • Django增删改查
    增删改查。配置对应路由,函数,视图。报错注意看控制台。添加取到前台传来的参数,后端给予验证。入库编辑,取到当前编辑得id,在后台查到对应数据。重新update删除,取到当前点......
  • springmvc请求参数
    请求参数中文乱码的解决在web.xml中配置Spring提供的过滤器类<!--配置过滤器,解决中文乱码的问题--><filter><filter-name>characterEncodingFilter</filter-name......