在 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)
,因为我们要保存对x
和y
的效果。
根据这个假设,我们可以重写为:
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
}
这是一个遍历点数组的函数。 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)
,因为我们要保存对x
和y
的效果。
根据这个假设,我们可以重写为:
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
}