猿问

Go 语言中的引用类型混乱

我试图用 Go 语言制作 Trie 数据结构,但不知何故它遇到了引用问题,就是这样。http://play.golang.org/p/ASSGF5Oe9R


// Package main provides ...

package main


import "fmt"


type RootTrie []Trie


type Trie struct {

    subtrie []Trie

    index   byte

}


func (trie *Trie) Insert(data string) *Trie {

    if data != "" {

        if trie.index == 0 {

            trie.index = data[0]

        }

        if next := trie.containsIndex(data[1:]); next != nil {

            //Problem Point

            fmt.Println(string(data[1]), "found follwing", string(data[0]))

            next.Insert(data[1:])

        } else {

            nt := &Trie{}

            trie.subtrie = append(trie.subtrie, *nt.Insert(data[1:]))

        }

    }


    return trie

}

func (trie *Trie) containsIndex(next string) *Trie {

    if next != "" {

        for _, st := range trie.subtrie {

            if st.index == next[0] {

                return &st

            }

        }

    }

    return nil

}


func main() {

    t := &Trie{}

    t = t.Insert("hanyang")

    fmt.Println("result:", t)

    t = t.Insert("hanyKk")

    fmt.Println("result:", t)

    t.Insert("hanyK")

}

以下问题发生在我放置的第二个“插入”中, //Problem Point


我制定containsIndex了搜索下一个链接trie的方法,实际上搜索得很好。但是当我更新给定的next属性时containsIndex,它并没有影响它的母结构trie。


我不明白的是我在返回时给了它引用类型containsIndex,但它仍然表现得像“复制值”,为什么它不影响它的母结构(trie)?


MMTTMM
浏览 205回答 1
1回答

守候你守候我

问题出在方法 containsIndex 中。range默认情况下,Golang创建切片中的每个元素的副本,并将此值的副本分配给st(在您的示例中)。通常要保留对切片中元素的引用,您应该使用原始切片及其索引。在你的情况下,方法 containsIndex 应该是这样的:func (trie *Trie) containsIndex(next string) *Trie {    if next != "" {        for i, st := range trie.subtrie {            if st.index == next[0] {                return &trie.subtrie[i]            }        }    }    return nil}
随时随地看视频慕课网APP

相关分类

Go
我要回答