第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

改變作為參數(shù)傳遞給 Go 中函數(shù)的切片

改變作為參數(shù)傳遞給 Go 中函數(shù)的切片

Go
MMTTMM 2022-07-11 14:58:23
我寫了一些代碼,其中一個函數(shù)f將切片s作為參數(shù)并修改它而不返回它。由于切片可以被視為對底層數(shù)組的引用,我認(rèn)為切片實(shí)際上會在該函數(shù)的范圍之外進(jìn)行修改,但事實(shí)并非如此。下面的代碼就是一個例子(https://play.golang.org/p/Y5JUmDtRXrz)。package mainimport (    "fmt")func pop(s []int) int {    first, s := s[0], s[1:]    return first}func main() {    s := []int{0, 1, 2, 3}    first := pop(s)    fmt.Println(first, s)}pop(s)實(shí)際上返回0,這是預(yù)期的。但是在輸出中s仍然有0它的第一個元素。0 [0 1 2 3]Program exited.為什么?我怎么能解決這個問題?
查看完整描述

2 回答

?
冉冉說

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個贊

這里發(fā)生了兩件不同的事情,兩者都阻止了它的行為如你所料:

func pop(s []int) int {
    first, s := s[0], s[1:]

第一個(也是更簡單的)問題是你在s這里定義了一個新的局部變量,它會影響你的函數(shù)參數(shù)s

其次,切片確實(shí)指向一個底層數(shù)組,但切片仍然通過副本傳遞,就像其他所有內(nèi)容一樣。這意味著:

s = s[1:]

修改您的 s 副本以在基礎(chǔ)數(shù)組上具有不同的窗口。這不會改變調(diào)用者中的切片。但是,如果您更改底層數(shù)組中的值,這反映在調(diào)用者中,例如:

s[1] = 42

您可以在整個 TourGo 博客上了解更多信息。


查看完整回答
反對 回復(fù) 2022-07-11
?
catspeake

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個贊

該行first, s := s[0], s[1:]創(chuàng)建了一個新變量s,因?yàn)槟褂玫氖?=. 最重要的是,如果要修改切片,則需要通過指針傳遞它。


通過值傳遞它,它將引用相同的底層數(shù)組,但切片本身是一個副本。因此,對底層數(shù)組的更改將反映在 中main,但對切片本身的更改不會。


這是一個通過指針傳遞切片的示例。


package main


import (

    "fmt"

)


func pop(s *[]int) int {

    first := (*s)[0]

    *s = (*s)[1:]

    return first

}


func main() {

    s := []int{0, 1, 2, 3}

    first := pop(&s)

    fmt.Println(first, s)

}


查看完整回答
反對 回復(fù) 2022-07-11
  • 2 回答
  • 0 關(guān)注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號