Sobes.tech
Senior

func main() { a := make([]int, 0, 3) a = append(a, 1) a = append(a, 2) add(a) fmt.Printf("%v", a) // } func add(a []int) { a = append(a, 3) a = append(a, 4) }

sobes.tech AI

AI-дан жауап

Бұл мысалда a кескіні ұзындығы 0 және сыйымдылығы 3 болып жасалады. main функциясында 1 және 2 элементтері қосылады, содан кейін add(a) функциясы шақырылады. add ішіндегі a кескінінің элементтері 3 және 4 қосылады, бірақ бұл — мән бойынша берілген локальды көшірме.

Go тілінде кескіндер — бұл массивке көрсеткіш, ұзындық және сыйымдылықты қамтитын құрылым. Кескінді функцияға беру кезінде құрылым көшіріледі, бірақ массив өзі көшірілмейді. Функция ішіндегі массив элементтеріне өзгерістер сыртта көрінсе де, ұзындықты өзгерту (мысалы, append) құрылымды өзгерткен кезде, егер жаңа кескін қайтарылмаса немесе көрсеткіш берілмесе, шақырылған функциядағы кескінге әсер етпейді.

Бұл жағдайда add функциясы локальды көшірмені өзгертеді, бірақ оны қайтармайды, сондықтан main ішіндегі a кескіні [1 2] күйінде қалады.

Шығару мысалы:

[1 2]

Егер add ішіндегі өзгерістер main-да көрінсін десеңіз,:

  • add функциясынан жаңа кескін қайтару және оны main-да тағайындау.
  • Немесе көрсеткіш арқылы беру.

Қайтару мысалы:

func add(a []int) []int {
    a = append(a, 3)
    a = append(a, 4)
    return a
}

func main() {
    a := make([]int, 0, 3)
    a = append(a, 1, 2)
    a = add(a)
    fmt.Printf("%v", a) // [1 2 3 4]
}