Golang中国
package main

import (
    "fmt"
)

type rect struct {
    width, height int
}

func (r *rect) area() int {
    return r.width * r.height
}

func (r *rect) perim() int {
    return 2 * (r.width + r.height)
}

func main() {
    r := rect{width: 10, height: 5}

    fmt.Println("area: ", r.area())
    fmt.Println("perim: ", r.perim())

    rp := &r
    fmt.Println("area: ", rp.area())
    fmt.Println("perim: ", rp.perim())

    fmt.Println(*rp == r)
    r.width = 100
    *rp.width = 100
}

除去最后一句的话输出:

area:  50
perim:  30
area:  50
perim:  30
true

直接打印rp的话会输出:&{width:30, height:50}
我表示可以理解
因为这里的指针默认解析了结构体*地址但是我不大明白的是为啥我通过*地址 去修改对象属性的时候会报错,*地址难道不是取得了对象本体吗


jimmykuu 于 2016-12-10 15:48 修改
3 回复
jthmath
#1 jthmath • 2016-12-10 17:48

.的优先级高于*,所以*rp.width等价于*(rp.width),这相当于对一个int进行*操作,这当然不对

stevewang
#2 stevewang • 2016-12-10 17:53

*rp.width = 100改成(*rp).width = 100
*rp.width是对rp.width进行dereference,而(*rp).width是对rp进行dereference,然后访问*rp这个对象的width成员。

adodo08
#3 adodo08 • 2016-12-12 09:21

谢谢各位大大

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。

作者

adodo08
hehe

发表话题

作者其它话题