Почему изменения в копии структуры отражают исходную структуру в go? - PullRequest
0 голосов
/ 08 апреля 2020

Я запутался в передаче по значению в Go. Я делаю это;

package main

import (
    "fmt"
)

type point struct {
    x    int
    list []int
}

func main() {
    p := point{20, []int{1, 2, 3, 4, 5}}

    fmt.Printf("Address: %p, Value: %v\n", &p, p)
    passByValue(p, 1)
    fmt.Printf("Address: %p, Value: %v\n", &p, p)

}

func passByValue(copyOfP point, i int) {
    copyOfP.list = append(copyOfP.list[:i], copyOfP.list[i+1:]...)
    fmt.Printf("From passByValue Address: %p, Value: %v\n", &copyOfP, copyOfP)
}

Вывод:

Original p Address: 0xc00000c080, Value: {20 [1 2 3 4 5]}
passByValue copyOfP Address: 0xc00000c0c0, Value: {20 [1 3 4 5]}
Original p Address: 0xc00000c080, Value: {20 [1 3 4 5 5]}

не должен copyOfP быть копией p и не отражать оригинал p как никогда.

Что здесь происходит?

1 Ответ

1 голос
/ 08 апреля 2020
func main() {

    // history.ReadlineTest()

    p := point{20, []int{1, 2, 3, 4, 5}}

    fmt.Printf("Address: %p, Value: %v\n", &p.list[0], p)
    passByValue(p, 1)
    fmt.Printf("Address: %p, Value: %v\n", &p.list[0], p)
}

func passByValue(copyOfP point, i int) {
    copyOfP.list = append(copyOfP.list[:i], copyOfP.list[i+1:]...)
    fmt.Printf("From passByValue Address: %p, Value: %v\n", &copyOfP.list[0], copyOfP)
}
Address: 0xc00001a0c0, Value: {20 [1 2 3 4 5]}
From passByValue Address: 0xc00001a0c0, Value: {20 [1 3 4 5]}
Address: 0xc00001a0c0, Value: {20 [1 3 4 5 5]}

Срез «список» повторно использовал ту же память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...