不明白这段 golang 代码是如果执行的?结果: list: [10 13 23] - V2EX
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 2079 次点击
    这是一个创建于 902 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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/td>
        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
    PRO
       2023-05-06 15:16:15 +08:00
    @OkabeRintaro 请不要再把 AI 生成的回复贴到这里。
    zanelee
        14
    zanelee  
       2023-05-06 18:00:13 +08:00
    我知道是 go 上泛型特性的例子,其他我都不懂嘿嘿
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3839 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 05:28 PVG 13:28 LAX 22:28 JFK 01:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86