编程最简单的算法之一,莫过于变量交换。交换变量的常见算法需要一个中间变量进行变量的临时保存。用传统方法编写变量交换代码如下:

  1. var a int = 100
  2. var b int = 200
  3. var t int
  4. t = a
  5. a = b
  6. b = t
  7. fmt.Println(a, b)

在计算机刚发明时,内存非常“精贵”。这种变量交换往往是非常奢侈的。于是计算机“大牛”发明了一些算法来避免使用中间变量:

  1. var a int = 100
  2. var b int = 200
  3. a = a ^ b
  4. b = b ^ a
  5. a = a ^ b
  6. fmt.Println(a, b)

这样的算法很多,但是都有一定的数值范围和类型要求。

到了 Go 语言时,内存不再是紧缺资源,而且写法可以更简单。使用 Go 的“多重赋值”特性,可以轻松完成变量交换的任务:

  1. var a int = 100
  2. var b int = 200
  3. b, a = a, b
  4. fmt.Println(a, b)

多重赋值时,变量的左值和右值按从左到右的顺序赋值。

多重赋值在 Go 语言的错误处理和函数返回值中会大量地使用。

例如,使用 Go 语言进行排序时就需要使用交换,代码如下:

  1. type IntSlice []int
  2. func (p IntSlice) Len() int { return len(p) }
  3. func (p IntSlice) Less(i, j int) bool { return p[i] < p[j] }
  4. func (p IntSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }

代码说明如下:

    • 第 1 行,将 []int 声明为 IntSlice 类型。
    • 第 3 行,为这个类型编写一个 Len 方法,提供切片的长度。
    • 第 4 行,根据提供的 i、j 元素索引,获取元素后进行比较,返回比较结果。
    • 第 5 行,根据提供的 i、j 元素索引,交换两个元素的值。

Golang --多个变量同时赋值的更多相关文章

  1. 为什么为 const 变量重新赋值不是个静态错误

    const 和 let 的唯一区别就是用 const 声明的变量不能被重新赋值(只读变量),比如像下面这样就会报错: const foo = 1 foo = 2 // TypeError: Assig ...

  2. main方法中声明8种基本数据类型的变量并赋值

    main方法中声明8种基本数据类型的变量并赋值  char→  int→ long→ float→ double byte→ short→ 

  3. 2.python的变量与赋值

    首先,为何要使用变量这里就不再多说了,我这里就介绍一下变量的命令规则和变量赋值的内存行为. 1.变量的命名规则 变量其实通过一个标记调用内存中的值,而变量名就是这个标记的名称,但是万一这个标记已经被提 ...

  4. Web Api 图片上传,在使用 Task.ContinueWith 变量无法赋值问题

    细谈 Web Api 图片上传,在使用 Task.ContinueWith 变量无法赋值问题的解决办法!   在使用Asp.Net Web Api 图片上传接口的时候,到网上找了一些个例子,但大多数找 ...

  5. Python学习笔记——基础篇【第一周】——变量与赋值、用户交互、条件判断、循环控制、数据类型、文本操作

    目录 Python第一周笔记 1.学习Python目的 2.Python简史介绍 3.Python3特性 4.Hello World程序 5.变量与赋值 6.用户交互 7.条件判断与缩进 8.循环控制 ...

  6. 第3章 Java语言基础----声明成员变量,对变量进行赋值

    声明成员变量,对变量进行赋值的正确语句,如下图所示:

  7. C语言_指针变量的赋值与运算,很详细

    指针变量的赋值 指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值.未经赋值的指针变量不能使用, 否则将造成系统混乱,甚至死机.指针变量的赋值只能赋予地址, 决不能赋予任何其它数据 ...

  8. python的变量与赋值

    1.变量的命名规则 变量其实通过一个标记调用内存中的值,而变量名就是这个标记的名称,但是万一这个标记已经被提前占用或者解释器认为这个标记是不合法的,那么就会报错.下面总结了一下变量的命名规则: 1.不 ...

  9. PHP变量传值赋值和引用赋值,变量销毁

    <?php $a = 100; $b = 200; var_dump($a,$b); //int(100) int(200) ?> php中,上面的代码,变量是怎么存放的呢? 上面的代码变 ...

随机推荐

  1. 用Desmos玩极坐标[适配手机端]

    前言 数学给人的印象一直就是算算算,今天我们不算,我们只玩. 必备条件 ①."呆萌"软件--Desmos 网址:https://www.desmos.com/calculator, ...

  2. vue-cli使用笔记

    安装nodejs 安装vue-clinpm install -g vue-cli 使用vue-cli初始化项目vue init webpack my-project 进到目录cd my-project ...

  3. Ps回调函数.拦截驱动模块原理+实现.

    目录 一丶简介 二丶原理 1.原理 2.代码实现 3.效果 一丶简介 主要是讲解.内核中如何拦截模块加载的. 需要熟悉.内核回调的设置 PE知识. ShellCode 二丶原理 1.原理 原理是通过回 ...

  4. ArgumentException: The Assembly Mono.WebBrowser is referenced by System.Windows.Forms ('Assets/Plugins/System.Windows.Forms.dll'). But the dll is not allowed to be included or could not be found.

    最近有个项目要用到System.Windows.Forms.dll,在Unity编辑器里用着还好好的,但是一导出就给我报错,让我十分不爽. 于是请教百度,搜出了五花八门的答案,没一个能解决我的问题的, ...

  5. Java基础 switch 简单示例

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  6. Chrome DevTools 之 Network,网络加载分析利器

    链接:https://www.jianshu.com/p/471950517b07 虽然一直在用Chrome DevTools,但大多停留在常用的功能和调试上,比如Elements/Network/S ...

  7. Sword 第三方库介绍二

    /* uuid生成 */ #include <stdio.h> #include <stdlib.h> /* calloc()函数头文件 */ #include <ass ...

  8. Angularjs Select获取数组下标

    一.定义资源 //资源类型 $scope.status=['项目测试','开发工具','安装包','工作计划','测试项目','我的游戏','我的音乐','博客首页图片']; 二.没错直接用  {{$ ...

  9. [ Docker ] 基础安装使用及架构

    目录- Centos7 安装 Docker- Docker 架构 1. CentOS7 安装 Docker 目前 docker 有三个分支,moby.docker-ce.docker-ee moby ...

  10. mysql之各版本rpm包安装

    发现每次想用mysql的rpm包直接安装的时候,都会出现找不到对应的rpm包的情况,故记录一下查找过程 进入官网->downloads->community->mysql commu ...