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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

go 方法 - 指針接收器并返回相同的指針

go 方法 - 指針接收器并返回相同的指針

Go
千巷貓影 2023-08-07 11:16:15
結(jié)構(gòu)體上的 go 方法接收指針引用,進(jìn)行一些修改并返回相同的指針。該結(jié)構(gòu)具有相同結(jié)構(gòu)的嵌套引用:當(dāng)使用值調(diào)用追加方法時(shí),由于某種原因它會(huì)丟失以前的值。package mainimport (    "fmt")type Node struct{    next *Node    val int}func newNode(val int) (*Node){    n := Node{    val: val,    }   return &n}func (n *Node) append(val int) (*Node){      for n.next != nil {     n = n.next      }      n.next = newNode(val)     return n}func (n *Node)printList(){    for n != nil {         fmt.Printf("%d,", n.val)         n = n.next    }    fmt.Println()}func main() {   n := newNode(3)   n.printList()   n = n.append(4)   n.printList()   n = n.append(5)   n.printList()   n = n.append(6)   n.printList()    }output:3,3,4,4,5,5,6,我本來(lái)期待 3,4,5,6,- 可能是我完全錯(cuò)過(guò)了一些基本知識(shí)。如果您有一些意見(jiàn),我們將不勝感激。https://play.golang.org/p/-zDH98UNFLa當(dāng)我修改追加方法時(shí),我得到了預(yù)期的結(jié)果,但沒(méi)有返回任何內(nèi)容。
查看完整描述

3 回答

?
手掌心

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊

append()返回下一個(gè)節(jié)點(diǎn)的指針。因此printList(),僅打印從下一個(gè)節(jié)點(diǎn)開(kāi)始的節(jié)點(diǎn)。如果您想打印列表中的所有節(jié)點(diǎn),您應(yīng)該添加一個(gè)變量來(lái)存儲(chǔ)引用該列表起始節(jié)點(diǎn)的指針。


func main() {

    n := newNode(3)


    head := n

    head.printList()


    n = n.append(4)

    head.printList()


    n = n.append(5)

    head.printList()


    n = n.append(6)

    head.printList() // 3,4,5,6

}


查看完整回答
反對(duì) 回復(fù) 2023-08-07
?
小唯快跑啊

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊

這個(gè)功能:


func (n *Node) append(val int) (*Node){

      for n.next != nil {

     n = n.next

      }

      n.next = newNode(val)

     return n

}

一般不返回其原始參數(shù)。它返回(假設(shè)非空)列表中倒數(shù)第二個(gè)節(jié)點(diǎn)。因此:


n = n.append(4)

添加一個(gè)節(jié)點(diǎn)holding4到原始節(jié)點(diǎn)holding 3,然后返回原始節(jié)點(diǎn)holding 3,但是:


n = n.append(5)

將持有 的節(jié)點(diǎn)添加5到原始列表,但隨后返回指向持有 的節(jié)點(diǎn)的指針4。這就是你4,5,現(xiàn)在看到的原因。出于同樣的原因,后續(xù)調(diào)用會(huì)不斷重復(fù)最后兩個(gè)元素。


您可以修改您的append函數(shù)以保存原始返回值并返回該值:


func (n *Node) append(val int) *Node {

    // find current tail

    t := n

    for t.next != nil {

        t = t.next

    }

    t.next = newNode(val)

    return n

}

但總的來(lái)說(shuō),這仍然不是一個(gè)很好的策略:例如,當(dāng)給定-valued時(shí),這append不起作用。考慮構(gòu)建一個(gè)能夠處理此類情況的列表類型。或者,正如Hsaio 的回答一樣,您可以讓調(diào)用者直接掛在頭節(jié)點(diǎn)上。如果你這樣做,你可以讓函數(shù)返回尾指針:nilnappend


func (n *Node) append(val int) *Node {

    n.next = newNode(val)

    return n.next

}

然后像這樣使用它:


head := newNode(3)

t := append(head, 4)

t = append(t, 5)

t = append(t, 6)

head.printList()

List(標(biāo)準(zhǔn) Go 包中已經(jīng)有一個(gè)container/list實(shí)現(xiàn),它可以很好地為您完成這些工作。您可以創(chuàng)建一個(gè)整體列表容器實(shí)例,而不是直接指向列表中的每個(gè)元素,該實(shí)例允許您在前面插入, insert-at-back、remove-from-anywhere 等等。這有點(diǎn)尷尬,因?yàn)樗糜趇nterface{}數(shù)據(jù),因此需要類型斷言來(lái)獲取每個(gè)節(jié)點(diǎn)的值。)


查看完整回答
反對(duì) 回復(fù) 2023-08-07
?
回首憶惘然

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊

n函數(shù)中的變量main被函數(shù)n中的變量覆蓋append。



查看完整回答
反對(duì) 回復(fù) 2023-08-07
  • 3 回答
  • 0 關(guān)注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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