Go 언어에서는 제거() 함수를 사용하여 목록 요소를 삭제할 수 있습니다. 구문은 "list object.Remove(element)"입니다. 매개변수 요소는 목록 요소가 삭제됨을 나타냅니다. 요소 요소는 비어 있을 수 없습니다. 비어 있지 않으면 삭제된 요소의 값이 반환됩니다. 비어 있으면 예외가 보고됩니다.
이 튜토리얼의 운영 환경: 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 :
package main import ( "container/list" "fmt" ) func main() { //使用 Remove 在列表中删除空元素,报错 listHaiCoder := list.New() listHaiCoder.PushFront("Hello") listHaiCoder.PushFront("HaiCoder") listHaiCoder.Remove(nil) }프로그램이 실행된 후 콘솔 출력은 다음과 같습니다.
확장 지식: 목록은 모든 요소를 삭제합니다
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 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!