为什么我更喜欢生锈而不是去
#go #rust

最近,我决定学习GO,我的第一印象相当不错。 Go是一种非常好的语言,很容易开始。 GO例程可能是该语言的最佳功能,我真的希望其他语言遵循此模型。 defer功能也非常好。

但是,随着我继续学习,有些事情开始感到奇怪,有些设计决策看起来很奇怪。例如,唯一的循环构造是for,无法创建一个循环,以一系列数字迭代,例如python中的for i in range(10)或rust中的for i in 0..10,您必须像c:for i := 0; i <= 10; i++中的循环一样使用一个循环。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< /p>

过了一会儿,我意识到:去尝试像C一样努力,以至于它甚至没有尝试进行改进,从而使其看起来与c。

现在让我们从Rust中比较RWMutexRWLock

lock := sync.RWMutex{}
lock.RLock()
// do someting
lock.Unlock()

此代码可以很好地编译,但是在运行时会失败,因为我致电lock.Unlock()而不是lock.RUnlock()。您可能会说这是开发人员的错,因为不关注错误的方法,而您是对的,但让我们看一下Rust的同等方法:

let lock = RwLock::new(1);

{
    let read = lock.read().unwrap();
    // do something
}

我们注意到的第一件事是,RWLock具有一个值,因为很常见,因此使用锁来同步访问某物。然后,我们打开卷曲括号以启动范围,因为lock.read()返回了锁定锁定范围时释放锁的警卫,因此没有错误的方法可以调用。错误处理可能看起来很烦人,但是it is there for a reason

对我来说,GO RWMutex的设计决定似乎很奇怪,如果RLock返回了一个句柄,您可以称呼Unlock,而我想不出任何原因,而是看起来更像C。< /p>

但是Rust并不完美,但是功能签名可能会变得凌乱,特别是与异步在一起,并且与生命有关,这并不有趣。和汇编时间...

我将继续学习,这确实是一种很好的语言,但我仍然更喜欢生锈,我对此感到更安全(双关语)。