最近,我决定学习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中比较RWMutex
与RWLock
:
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并不完美,但是功能签名可能会变得凌乱,特别是与异步在一起,并且与生命有关,这并不有趣。和汇编时间...
我将继续学习,这确实是一种很好的语言,但我仍然更喜欢生锈,我对此感到更安全(双关语)。