聊一聊被人嘲笑的if err!=nil和golang为什么要必须支持多返回值?

golang多返回值演示

  • 我们知道,多返回值是golang的一个特性,比如下面这段代码,里面的参数名我起了几个比较好区分的
go 复制代码
package main

func main() {
	Swap(10999, 10888)
}

func Swap(saaa, sbbb int) (int, int) {
	return sbbb, saaa
}

golang为什么要支持多返回值

  • golang没有try catch 异常捕捉机制,那么我们至少需要一个返回值来返给我们结果,第二个如果有error了,我们需要知道error,由程序员去控制要不要处理error,而不是直接panic,虽然if err!=nil 被其他程序员嘲笑,但是,这确实是go处理错误的一种方式
  • go是静态语言,在接收值的时候,我们已经规定好了返回的类型是什么,如果正确了返回正确的值,如果错误了,你可以返回我nil和error,而不是直接把error作为返回值给我。

golang 怎么实现的多返回值

  • 我们知道,在其他语言中,是没有多返回值这一说的,但是我们可能会见到这样的代码,通过传指针的方式给一个函数,从而改变了多个变量的值,比如下面这段c代码
css 复制代码
#include <stdio.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int a = 5, b = 10;
    printf("交换前: a = %d, b = %d", a, b);
    swap(&a, &b);
    printf("交换后: a = %d, b = %d", a, b);
    return 0;
}

-编译查看结果

css 复制代码
$ gcc cc.c -o cc
$ ./cc 
交换前: a = 5, b = 10交换后: a = 10, b = 5

看似实现了一样的功能,但是两者的实现方式是不一样的。

  • 那么接下来我们看看go是怎么样实现多返回值的,通过命令go tool compile -S -N -l main.go 查看编译代码,我们参照代码对比看一下 我们看到,传参和返回值都是通过多个寄存器来实现的,我们看一下c的,代码如下
arduino 复制代码
#include <stdio.h>
int sum(int arg1, int arg2) {
    return arg1 + arg2;
}
int main() {
    sum(11999,11888);
}

通过命令 gcc -S cc.c -o - | more查看编译代码

相关推荐
三水不滴1 分钟前
利用SpringCloud Gateway 重试 + 降级解决第三方接口频繁超时问题,提升性能
经验分享·笔记·后端·spring·spring cloud·gateway
canonical_entropy2 分钟前
当复杂性被显式化:Nop平台的认知经济学
后端·低代码·aigc
codeejun4 分钟前
每日一Go-24、Go语言实战-综合项目:规划与搭建
开发语言·后端·golang
我爱娃哈哈5 分钟前
SpringBoot + MQTT + EMQX:物联网设备上行数据实时接入与指令下发平台
spring boot·后端·物联网
摸鱼的春哥8 分钟前
春哥的Agent通关秘籍11:本地RAG实战(中上)
前端·javascript·后端
GetcharZp8 分钟前
谁是OpenClaw?这个一夜爆火的“AI打工人”,正在悄悄接管你的电脑!
人工智能·后端
楼田莉子8 分钟前
C++高精度时间库——<chrono>
开发语言·c++·后端·学习·visual studio
石牌桥网管8 分钟前
Go类型断言
开发语言·后端·golang
学嵌入式的小杨同学1 小时前
嵌入式硬件开发入门:PCB 设计核心流程 + 基础元器件实战指南
vscode·后端·嵌入式硬件·架构·vim·智能硬件·pcb工艺
怒放吧德德9 小时前
Java 网络编程核心:BIO、NIO、AIO IO 模型深度解析与实战
后端·netty