Go 言語では、remove() 関数を使用してリスト要素を削除できます。構文は「list object.Remove(element)」です。parameter 要素は、リスト要素を削除することを示します。 element 要素を空にすることはできません。空でない場合は、削除された要素の値が返されます。空の場合は、例外が報告されます。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
go は、Python の list に似た list パッケージを提供します。このパッケージは、あらゆる種類のデータを格納でき、次のように対応する API を提供します。
type Element func (e *Element) Next() *Element func (e *Element) Prev() *Element type List func New() *List func (l *List) Back() *Element func (l *List) Front() *Element func (l *List) Init() *List func (l *List) InsertAfter(v interface{}, mark *Element) *Element func (l *List) InsertBefore(v interface{}, mark *Element) *Element func (l *List) Len() int func (l *List) MoveAfter(e, mark *Element) func (l *List) MoveBefore(e, mark *Element) func (l *List) MoveToBack(e *Element) func (l *List) MoveToFront(e *Element) func (l *List) PushBack(v interface{}) *Element func (l *List) PushBackList(other *List) func (l *List) PushFront(v interface{}) *Element func (l *List) PushFrontList(other *List) func (l *List) Remove(e *Element) interface{}
その中で、remove() 関数が使用されます。リストの場合 リストから要素を削除します。削除された要素を空にすることはできません。空の場合は、例外が報告されます。
Remove(e *Element) interface{}
パラメータ | 説明 |
---|---|
e | ##リスト要素を削除するには。
例 1:
package main import ( "container/list" "fmt" ) func main() { //使用 Remove 在列表中删除元素 listHaiCoder := list.New() listHaiCoder.PushFront("Hello") listHaiCoder.PushFront("HaiCoder") element := listHaiCoder.PushFront("Hello") removeEle := listHaiCoder.Remove(element) fmt.Println("RemoveElement =", removeEle) for i := listHaiCoder.Front(); i != nil; i = i.Next() { fmt.Println("Element =", i.Value) } }
分析:
package main import ( "container/list" "fmt" ) func main() { //使用 Remove 在列表中删除空元素,报错 listHaiCoder := list.New() listHaiCoder.PushFront("Hello") listHaiCoder.PushFront("HaiCoder") listHaiCoder.Remove(nil) }
プログラムを実行すると、コンソールの出力は次のようになります:
拡張知識: list はすべての要素を削除します
list パッケージが提供する API を使用すると、リストは確かに非常に便利ですが、使用中に注意しないと、見つけるのが難しいいくつかの落とし穴に遭遇し、その結果、プログラムの結果が期待どおりにならなくなります。ここでの落とし穴は、for ループを介してリストを走査し、すべての要素を削除するときに遭遇する問題です。たとえば、次のサンプル プログラムでは、リストを作成し、0 ~ 3 を順番に格納し、for ループを通じてリストを走査してすべての要素を削除します。
package main import ( "container/list" "fmt" ) func main() { l := list.New() l.PushBack(0) l.PushBack(1) l.PushBack(2) l.PushBack(3) fmt.Println("original list:") prtList(l) fmt.Println("deleted list:") for e := l.Front(); e != nil; e = e.Next() { l.Remove(e) } prtList(l) } func prtList(l *list.List) { for e := l.Front(); e != nil; e = e.Next() { fmt.Printf("%v ", e.Value) } fmt.Printf("n") }
プログラムを実行すると、出力は次のようになります。 ##
original list: 0 1 2 3 deleted list: 1 2 3From 出力を見ると、リスト内の要素が完全に削除されておらず、最初の要素 0 だけが削除されていることがわかりますが、これは当初の考えとは異なります。 、リストを走査してすべての要素を削除する書き方は次のようになります:
for e := l.Front(); e != nil; e = e.Next() { l.Remove(e) }しかし、上記のコード例の出力によれば、リストのすべての要素を削除することは無効です。問題? for ループのメカニズムから、最初の要素は削除されていますが、2 番目の要素は削除されていないため、2 番目のループの条件が無効であることがわかり、ループが終了します。次のステートメントを実行します:
l.Remove(e)e は nil である必要があるため、ループは終了します。 for ループ内の l.Remove(e) ステートメントの前に検証する print ステートメントを追加します。たとえば、次のステートメントを追加します:
fmt.Println("delete a element from list")プログラムの実行出力は次のとおりです:
original list: 0 1 2 3 deleted list: delete a element from list 1 2 3実際にループしているだけであることがわかります。一度ループすると、サイクルが終了します。つまり、ステートメント l.Remove(e) が実行された後、e は e.Next() と等しくなります。e.Next() が nil であるため、e は nil となり、ループは終了します。 e.Next() が nil なのはなぜですか? go list のソース コードを見ると、次のようになります。
// remove removes e from its list, decrements l.len, and returns e. func (l *List) remove(e *Element) *Element { e.prev.next = e.next e.next.prev = e.prev e.next = nil // avoid memory leaks e.prev = nil // avoid memory leaks e.list = nil l.len-- return e } // Remove removes e from l if e is an element of list l. // It returns the element value e.Value. func (l *List) Remove(e *Element) interface{} { if e.list == l { // if e.list == l, l must have been initialized when e was inserted // in l or l == nil (e is a zero Element) and l.remove will crash l.remove(e) } return e.Value }ソース コードから、 l.Remove(e) が実行されると、 l.remove(e) メソッドが呼び出されることがわかります。内部的に要素 e を削除します。メモリ リークを避けるために、e.next と e.prev には nil が割り当てられますが、これが問題の原因です。 修正手順は次のとおりです:
package main import ( "container/list" "fmt" ) func main() { l := list.New() l.PushBack(0) l.PushBack(1) l.PushBack(2) l.PushBack(3) fmt.Println("original list:") prtList(l) fmt.Println("deleted list:") var next *list.Element for e := l.Front(); e != nil; e = next { next = e.Next() l.Remove(e) } prtList(l) } func prtList(l *list.List) { for e := l.Front(); e != nil; e = e.Next() { fmt.Printf("%v ", e.Value) } fmt.Printf("n") }プログラムを実行した結果は次のとおりです:
original list: 0 1 2 3 deleted list:ご覧のとおり、リスト内のすべての要素が削除されています。正しく。 【関連する推奨事項:
Go ビデオ チュートリアル
、プログラミング教育 】
以上がGo言語でリストから要素を削除する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。