golang 泛型_还是说说泛型, Goer哭吧

本文探讨了Golang和Rust两种编程语言对泛型的处理方式。Golang因其简洁性而闻名,但缺乏泛型;而Rust虽然学习曲线较陡,但其泛型特性使得代码更简洁且功能强大。通过示例展示了Rust中如何使用泛型及错误处理。尽管Rust的泛型和错误处理可能初看起来较为复杂,但它们有助于编写高效且类型的代码。
摘要由CSDN通过智能技术生成

de7777210a9f45efe659d308d44eeee4.png

泛型 提供一种可能,就是将数据类型 作为参数,传递过去。

这为复用提供可能,意义非凡。

golang没有泛型,经常为人所诟病。rust作为一个非常精致的语言,提供泛型是必须的。

比较这二种语言,泛型的引入,使程序员的工作更简单了吗?还是让语言的表达能力变强大了?

一种表达是go吹派,泛型是什么东西,太麻烦,大道至简。

另一派是rust,虽然学习麻烦的语言,会多掉几根头发。不过想想我的代码,会变的简洁又功能强大,一切都是值得的。

也许你该先看一下,我未来即将发表的文章:Optine<T> 引路

rust的错误处理,用到的是Result<T, E>枚举和问号 ?。

最常用的函数的返回 类型,是Result<T, E>,这里的T,E也可以是其它任意大写字母。

enum 

举例:

fn halves_if_even<'a>(i: i32) -> Result<i32, &'a str> {
    // 取数值的二分之一.
    if i % 2 == 0 {
        Ok(i / 2)
    } else {
        Err("error")
    }
}

这里的<'a>是个生命周期参数,先不用管它。注意到这个函数,要么返回OK,要么Err就行了。

如何处理Result<i32, &'a str>这种返回类型?先列出第一种:

fn not_use_question_mark() {
    let a = 10;    //把这里改成 9 就会报错.
    let half = halves_if_even(a);
    let half = match half {
        Ok(item) => item,    //匹配到这项,返回了a
        Err(e) => panic!(e), //匹配到这行,程序爆掉了
    };
    assert_eq!(half, 5);
}

感觉这种错误处理,并不是那么 简洁的话,可以用:

fn use_question_mark<'a>() -> Result<i32, &'a str> {
    // 这里必须要返回Result
    let a = 10;
    let half = halves_if_even(a)?; // 如果函数返回的类型不是Result,就不能用?号,切记!
    assert_eq!(half, 5);
    Ok(half)
}

关于问号的应用,这里有个有个原话,可以参考:

the `?` operator can only be used in a function that returns `Result` or `Option`
(or another type that implements `std::ops::Try`)

golang,连枚举都没有,更别提泛型。不过可以模拟:

package 

golang的可以通过接口来模拟泛型。

看了些代码,大致感受是, go容易学习,尽量不提供复杂的概念,不过想用较少而简单的模块,堆出复杂的东西。结果就是粗粒度的,象“我的世界”游戏中的感觉。

而rust入门难,概念多而复杂,学习曲线陡峭。一旦掌握,能写出简洁又功能强大 的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值