在 Go 中表达函数的更好方法(结构方法)

better way to express a function in Go (Struct methods)

这是一个遍历点数组的函数。 Point 是一个结构,其元素 x 和 y 类型为 int。遍历函数是从另一个值为 dir 的函数调用的。可以避免循环开始时的 if 检查,因为一旦函数被调用,dir 值就不会改变。有没有更好的方式在 Go 中表达这个逻辑? struct方法returns一个Point。我提供了一个结构方法的例子。

type Point struct {
    x int
    y int
}

func (p Point) next_row() Point {
    nearby := Point{p.x + 1, p.y}
    return nearby
}

func trv_point(p Point, p_list []Point, dir string) int {
    seg_count := 0
    var nearby Point
    for {
        if dir == "up" {
            nearby = p.prev_row()
        }
        if dir == "down" {
            nearby = p.next_row()
        }
        if dir == "left" {
            nearby = p.prev_col()
        }
        if dir == "right" {
            nearby = p.next_col()
        }

        if !check_point_in_slice(p_list, nearby) {
            break
        }
        seg_count++
        p = nearby

    }
    return seg_count
}

因为 dir 在这里没有改变,所以那些 if 语句是多余的,对于这种情况你也应该使用 if-else 语句因为只是 ["up" 之一, “下”、“左”、“右”] 可能发生。 先看这个例子:

type Point struct {
    x int
    y int
}

func (p *Point) next_row() {
    p.x += 1
}

func main() {
    p := Point{0, 0}
    f := p.next_row

    for i := 0; i < 2; i++ {
        fmt.Println(p)
        f()
    }
    fmt.Println(p)
}

输出将是:

{0 0}
{1 0}
{2 0}

此处我们将接收器从(p Point)更改为(p *Point),因为我们要保存对xy的效果。 根据这个假设,我们可以重写为:

type Point struct {
    x int
    y int
}

func (p *Point) next_row() {
    p.x += 1
}

func get_move(dir string) func() {
    var f func()
    switch dir {
    case "up":
        f = p.prev_row
    case "down":
        f = p.next_row
    case "left":
        f = p.prev_col
    case "right":
        f = p.next_col
    }
    return f
}

func trv_point(p Point, p_list []Point, dir string) int {
    seg_count := 0
    var nearby Point
    f := get_move(dir)
    for check_point_in_slice(p_list, p) {
        f()
        seg_count++
    }
    return seg_count
}