V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
thereyou
V2EX  ›  Go 编程语言

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

  •  
  •   thereyou · 2023-05-05 14:41:30 +08:00 · 1705 次点击
    这是一个创建于 597 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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())
    }
    14 条回复    2023-05-06 18:00:13 +08:00
    skywalkerfc
        1
    skywalkerfc  
       2023-05-05 14:47:21 +08:00
    哪里不明白呢,就是链表的基本操作。
    deplivesb
        2
    deplivesb  
       2023-05-05 14:51:23 +08:00
    建议重学数据结构
    OkabeRintaro
        3
    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
        4
    golangLover  
       2023-05-05 15:17:28 +08:00 via Android   ❤️ 1
    @Livid 看一下 3 楼
    lhbc
        5
    lhbc  
       2023-05-05 15:25:31 +08:00 via Android
    一个问题,能用 ChatGPT 或者搜索引擎轻易得到准确答案的
    这种问题是否有意义再讨论?
    AS4694lAS4808
        6
    AS4694lAS4808  
       2023-05-05 15:35:50 +08:00
    不会 go ,但是看了前两个类型定义感觉就知道是干什么的了。。
    thereyou
        7
    thereyou  
    OP
       2023-05-05 15:49:43 +08:00
    各位大姥,抛开链表结构操作逻辑,我想知道的是在这段代码里每次 push 完后是如何保存之前的数据?
    JKeita
        8
    JKeita  
       2023-05-05 15:58:36 +08:00
    @thereyou 这是一个指针链表队列,element 的 Val 保存了值,element 相当于一个节点,Next 指向下一个节点。建议看看数据结构相关。
    JKeita
        9
    JKeita  
       2023-05-05 16:00:46 +08:00
    @thereyou
    lst.tail.next = &element[T]{val: v} // 当前尾部指针指向的元素的 Nexit 指针指向新增节点
    lst.tail = lst.tail.next // 尾部指针执行新增节点
    thereyou
        10
    thereyou  
    OP
       2023-05-05 16:11:28 +08:00
    @JKeita 所以是 element 结构体字段 next 数据类型是所在结构体的指针类型就表示这是一个指针链表队列
    JKeita
        11
    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
        12
    JKeita  
       2023-05-05 16:21:43 +08:00
    @thereyou 建议去看看指针相关的教程
    Livid
        13
    Livid  
    MOD
       2023-05-06 15:16:15 +08:00
    @OkabeRintaro 请不要再把 AI 生成的回复贴到这里。
    zanelee
        14
    zanelee  
       2023-05-06 18:00:13 +08:00
    我知道是 go 上泛型特性的例子,其他我都不懂嘿嘿
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5507 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:57 · PVG 13:57 · LAX 21:57 · JFK 00:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.