指针表示内存上的一段数据的位置、长度、类型信息。在 Go 和 Rust 里面都可以操作指针,咱用一个最简单的例子来看看它们的异同之处。

Go

func zeroval(ival int) {
    ival = 0
}

func zeroptr(iptr *int) {
    *iptr = 0
}

func main() {
    i := 1
    fmt.Println("initial:", i)
    
    zeroval(i)
    fmt.Println("zeroval:", i)
    
    zeroptr(&i)
    fmt.Println("zeroptr:", i)
    
    fmt.Println("pointer:", &i)
}
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0xc000022050

在 go 语言里,参数传入的时候是默认复制一份的,所以不会被修改。除非传入的是指向数据的指针。

Rust

在 Rust 里咱可以实现一样的机制。

fn main() {
    fn zeroval(ival: &i32) {
        let ival = 0;
    }
    
    fn zeroptr(iptr: &mut i32) {
        *iptr = 0;
    }
    
    let mut i = 1;
    println!("initial: {:?}", &i);
    
    zeroval(&i);
    println!("zeroval: {:?}", &i);
    
    zeroptr(&mut i);
    println!("zeroptr: {:?}", &i);
    
    let ptr: *mut i32 = &mut i;
    println!("pointer: {:?}", ptr);
    
}
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x7ffc2c6e5990

Ljzn
399 声望102 粉丝

网络安全;函数式编程;数字货币;人工智能