这是一个遍历点数组的函数.点是一个包含int类型元素x和y的 struct .遍历函数是从另一个值为dir的函数调用的.可以避免循环开始时的if判断,因为调用函数后,dir值不会改变.有没有更好的方式来表达围棋中的这种逻辑?struct方法返回一个点.我提供了一个struct方法的示例.

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条语句,因为只有一条["向上"、"向下"、"向左"、"向右"]可能发生.

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
}

Go相关问答推荐

GitHub发布Golang子模块

为什么没有正确生成这些元组?

exec的可执行决议.命令+路径

如何在gofiber/websocket/v2中设置状态代码和原因

这是go语言gin提供的关于TypeEngine和RouterGroup的问题

Golang:访问any类型泛型上的字段

Kusto Go API 从多个表查询

如何在golang中使用viper获取对象的配置数组?

如何根据地址和大小打印字符串

使用goroutines在Golang中验证 struct

hyperledger fabric - go:在 $PATH 中找不到可执行文件

如何在 Go 中编写示例测试?

使用 ssh 从私有 gilab 仓库导入一个 go 项目:未知修订

如何使用特定的 Go 版本运行 govulncheck?

为什么 0 big.Int 的 .Bytes() 值是空切片?

如何获取多个 url 参数值

GoReleaser 和 ssh-agent Github 操作:为什么无法读取用户名...终端提示已禁用?

测试包外文件时的 Golang 测试覆盖率

Gin中测试模式有什么用

Go 1.18 泛型如何使用接口定义新的类型参数