Во втором примере вы передаете указатель на срез. Почти никогда нет причин делать это, так как срез уже является указателем на массив (вместе с длиной и емкостью).
Ваш указатель на срез содержит экземпляры Vertex, а не * Vertex, поэтому их изменение не оказывает никакого влияния. Если вы вместо этого изменили подпись вашего метода на
func modifyArray(vertices []*Vertex)
и передал часть указателей, тогда вы можете изменить их, как вы ожидаете.
Вот игровая площадка , показывающая вам пример. Соответствующий код ниже
package main
import "fmt"
type Vertex struct {
x int
y int
}
func modifyObject(v *Vertex) {
v.x = v.x * v.x
v.y = v.y * v.y
}
func modifyArray(vertices []*Vertex) {
for _, v := range vertices {
v.x = v.x * v.x
v.y = v.y * v.y
}
}
func main() {
v := Vertex{2, 3}
modifyObject(&v)
fmt.Println("Vertex modified successfully:", v)
v1 := Vertex{2, 3}
v2 := Vertex{20, 30}
vertices := []*Vertex{&v1, &v2}
modifyArray(vertices)
fmt.Printf("Vertices are modified: %v %v", vertices[0], vertices[1])
}