不明白这段 golang 代码是如果执行的?结果: list: [10 13 23]

2023-05-05 14:41:30 +08:00
 thereyou
package main

import "fmt"

type List[T any] struct {
head, tail *element[T]
}

type element[T any] struct {
next *element[T]
val T
}

func (lst *List[T]) Push(v T) {
if lst.tail == nil {
lst.head = &element[T]{val: v}
lst.tail = lst.head
} else {
lst.tail.next = &element[T]{val: v}
lst.tail = lst.tail.next
}
}

func (lst *List[T]) GetAll() []T {
var elems []T
for e := lst.head; e != nil; e = e.next {
elems = append(elems, e.val)
}
return elems
}

func main() {
lst := List[int]{}
lst.Push(10)
lst.Push(13)
lst.Push(23)
fmt.Println("list:", lst.GetAll())
}
1496 次点击
所在节点    Go 编程语言
14 条回复
skywalkerfc
2023-05-05 14:47:21 +08:00
哪里不明白呢,就是链表的基本操作。
deplivesb
2023-05-05 14:51:23 +08:00
建议重学数据结构
OkabeRintaro
2023-05-05 15:08:39 +08:00
这段 Go 代码定义了一个泛型类型 List[T],用于表示一个简单的单向链表数据结构。该数据结构包含两个字段 head 和 tail ,分别表示链表头和尾。每个元素由一个 element[T] 结构体表示,其中 val 字段存储元素的值,next 字段存储指向下一个元素的指针。

该代码还实现了两个方法 Push 和 GetAll 。Push 方法用于在链表末尾添加一个元素,它先判断链表是否为空,如果是,则将新元素赋值给 head 和 tail ;否则,创建一个新元素,将其链接到链表尾部,并更新 tail 的值。GetAll 方法用于返回链表中所有元素的值,它遍历整个链表,将每个元素的值追加到一个切片中,并最终返回该切片。

在 main 函数中,首先创建了一个 List[int] 类型的变量 lst ,然后分别调用 Push 方法将整数 10 、13 、23 添加到链表中,最后调用 GetAll 方法获取链表中所有元素的值,并将结果打印出来。由于添加了三个元素,因此打印的结果为 [10 13 23]。
---来自 chatGPT
golangLover
2023-05-05 15:17:28 +08:00
@Livid 看一下 3 楼
lhbc
2023-05-05 15:25:31 +08:00
一个问题,能用 ChatGPT 或者搜索引擎轻易得到准确答案的
这种问题是否有意义再讨论?
AS4694lAS4808
2023-05-05 15:35:50 +08:00
不会 go ,但是看了前两个类型定义感觉就知道是干什么的了。。
thereyou
2023-05-05 15:49:43 +08:00
各位大姥,抛开链表结构操作逻辑,我想知道的是在这段代码里每次 push 完后是如何保存之前的数据?
JKeita
2023-05-05 15:58:36 +08:00
@thereyou 这是一个指针链表队列,element 的 Val 保存了值,element 相当于一个节点,Next 指向下一个节点。建议看看数据结构相关。
JKeita
2023-05-05 16:00:46 +08:00
@thereyou
lst.tail.next = &element[T]{val: v} // 当前尾部指针指向的元素的 Nexit 指针指向新增节点
lst.tail = lst.tail.next // 尾部指针执行新增节点
thereyou
2023-05-05 16:11:28 +08:00
@JKeita 所以是 element 结构体字段 next 数据类型是所在结构体的指针类型就表示这是一个指针链表队列
JKeita
2023-05-05 16:20:38 +08:00
@thereyou
type element[T any] struct {
next *element[T] // 前面有*代表 next 字段是一个指针,存储的是 element 的地址
val T
}

lst.tail.next = &element[T]{val: v} // &代表取得是该实例的地址
JKeita
2023-05-05 16:21:43 +08:00
@thereyou 建议去看看指针相关的教程
Livid
2023-05-06 15:16:15 +08:00
@OkabeRintaro 请不要再把 AI 生成的回复贴到这里。
zanelee
2023-05-06 18:00:13 +08:00
我知道是 go 上泛型特性的例子,其他我都不懂嘿嘿

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/937553

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX