值类型

值类型是一种具有传递即复制的语义行为的类型,具有值类型的变量,其中保存的是数据自身,而不是指向数据的引用。由于值类型的这种特性,开发者选择性地使用值类型可以使得程序显著减少修改语义,从而让程序变得更可预测、更可靠。

例如最典型的并发安全问题就是在程序不同的线程中传递了同一个可变对象,此时访问这个对象的字段将会造成不可预测的 data race 问题。如果这个对象具备值语义,那么在传递的过程中我们就可以保证它经过了完整的复制,让每个线程对该值的访问都是彼此独立的,从而保证了并发安全。

仓颉原生支持了值类型,除了常见的 Int 类型以外,仓颉也可以使用 struct 来实现用户自定义的值类型。

如下面的例子,Point 正是一个值类型,因此在经过赋值后,a 和 b 已经是两个彼此独立的变量,对 a 的修改不会影响到 b。

struct Point {
    var x: Int
    var y: Int
    init(x: Int, y: Int) { ... }
    ...
}

var a = Point(0, 0)
var b = a
a.x = 1
print(b.x) // 0