交互式爱情
x邻居的 和索引都y可能超出范围,不仅是在 时-1,而且当它们 >= 您用它们索引的切片的长度时。所以基本上有 4 个邻居:(y-1,x), (y+1, x), (y,x-1), (y,x+1)你必须检查所有越界的情况。您的恐慌发生在线路上k := ...,而不是在for循环内。同样在循环的早期返回将不会处理所有元素,这for从根本上就是错误的。所以基本上这是你可以做到的:var result []intif y > 0 { result = append(result, matrix[y-1][x])}if y < len(matrix)-1 { result = append(result, matrix[y+1][x])}if x > 0 { result = append(result, matrix[y][x-1])}if x < len(matrix[y])-1 { result = append(result, matrix[y][x+1])}return result这将输出(在Go Playground上尝试):[2 2]注意,如果xory已经无效,上面的代码仍然会 panic。如果你想防止它,你还必须验证xand y,例如:var result []intif y < 0 || y >= len(matrix) || x < 0 || x >= len(matrix[y]) { return result}另一种方法是在另一个切片中列出邻居的deltaY和索引:deltaXvar neighbors = [][]int{ {-1, 0}, {1, 0}, {0, -1}, {0, 1},}您可以使用循环遍历neighbors,然后您可以在一个地方检查索引:var result []intfor _, neighbor := range neighbors { iy, ix := y+neighbor[0], x+neighbor[1] if iy < 0 || iy >= len(matrix) || ix < 0 || ix >= len(matrix[iy]) { continue } result = append(result, matrix[iy][ix])}return result在Go Playground试试这个。请注意,如果您在矩阵外部指定索引,并且该元素的邻居落在矩阵内,则第二个解决方案也会返回邻居。y=-1例如,使用, 作为输入,将返回x=0邻居 (y+1,x) 。0