>  기사  >  백엔드 개발  >  Go 언어 목록에서 요소를 삭제하는 방법

Go 언어 목록에서 요소를 삭제하는 방법

青灯夜游
青灯夜游원래의
2023-01-16 10:59:092555검색

Go 언어에서는 제거() 함수를 사용하여 목록 요소를 삭제할 수 있습니다. 구문은 "list object.Remove(element)"입니다. 매개변수 요소는 목록 요소가 삭제됨을 나타냅니다. 요소 요소는 비어 있을 수 없습니다. 비어 있지 않으면 삭제된 요소의 값이 반환됩니다. 비어 있으면 예외가 보고됩니다.

Go 언어 목록에서 요소를 삭제하는 방법

이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.

go는 파이썬의 리스트와 유사한 리스트 패키지를 제공하는데, 이는 모든 유형의 데이터를 저장할 수 있으며 이에 상응하는 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(e *Element) interface{}
Parameters Description
e 목록 요소를 제거합니다.

Return Value

  • 삭제된 요소의 값을 반환합니다. list 목록 삭제 요소의 예기 예입니다. 예 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)
    	}
    }

analysis :

Go 언어 목록에서 요소를 삭제하는 방법


the list.new를 통해 Listhaicoder 목록을 만들고 푸시 프론트 함수를 사용하여 세 항목을 삽입했습니다. 목록 요소를 삭제한 다음 제거 기능을 사용하여 마지막으로 삽입된 요소를 삭제합니다.
  • 마지막으로 삭제된 요소와 삭제된 목록을 인쇄합니다. Remove 함수는 삭제된 요소의 값을 반환하는 동시에 마지막으로 삽입된 요소가 목록에서 성공적으로 삭제되었음을 확인합니다.
  • 예 2: 빈 요소 삭제
  • package main
    import (
    	"container/list"
    	"fmt"
    )
    func main() {
    	//使用 Remove 在列表中删除空元素,报错
    	listHaiCoder := list.New()
    	listHaiCoder.PushFront("Hello")
    	listHaiCoder.PushFront("HaiCoder")
    	listHaiCoder.Remove(nil)
    }
프로그램이 실행된 후 콘솔 출력은 다음과 같습니다.

Go 언어 목록에서 요소를 삭제하는 방법확장 지식: 목록은 모든 요소를 ​​삭제합니다

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 3

From the 출력을 보면 목록의 요소가 완전히 삭제되지 않았으며 첫 번째 요소 0만 삭제되었음을 알 수 있습니다. 이는 Go의 사용 습관에 따라 목록을 순회하여 모든 요소를 ​​삭제해야 한다는 것입니다.

for e := l.Front(); e != nil; e = e.Next() {
    l.Remove(e)
}

그러나 위 예제 코드의 출력에 따르면 이는 목록의 모든 요소를 ​​삭제하는 것이 유효하지 않은데 무엇이 문제일까요? for 루프 메커니즘을 통해 첫 번째 요소는 삭제되었지만 두 번째 요소는 삭제되지 않았기 때문에 두 번째 루프의 조건이 유효하지 않아 루프가 종료된다는 것을 알 수 있습니다. 즉, 실행 후 다음 명령문:

l.Remove(e)

e should는 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 요소를 삭제하는 것을 볼 수 있습니다. . 메모리 누수를 방지하기 위해 문제의 원인인 nil에 e.next 및 e.prev를 할당합니다.

수정된 프로그램은 다음과 같습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.