登录
首页 >  Golang >  Go问答

Go 模块是否包含元数据存储?

来源:stackoverflow

时间:2024-02-25 16:24:21 500浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《Go 模块是否包含元数据存储?》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

与 npm 一样,npm 中的所有包都有一个索引文件 - https://replicate.npmjs.com/_all_docs。我的问题是Go中也有这样的索引文件吗?


解决方案


位于 https://index.golang.org/index 的模块索引是通过 https://proxy.golang.org 获取的新模块版本的提要(两者的文档均为 here)。它是可用的最全面的索引,但考虑到 proxy.golang.org 的使用是可选的,它肯定不完整。

通过将since查询参数设置为前一个块中的最大时间戳,您可以以2k块的形式读取proxy.golang.org看到的所有模块版本。

使用以下代码读取整个提要:

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
)

type module struct {
    Path, Version, Timestamp string
}

func chunk(since string) ([]module, error) {
    resp, err := http.Get("https://index.golang.org/index?since=" + since)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    dec := json.NewDecoder(resp.Body)
    var mods []module
    for dec.More() {
        var mod module
        if err := dec.Decode(&mod); err != nil {
            return nil, err
        }
        mods = append(mods, mod)
    }
    return mods, nil
}

func main() {
    var lastMod module
    for {
        mods, err := chunk(lastMod.Timestamp)
        if err != nil {
            log.Fatal(err)
        }

        // We are done of there are no results.
        if len(mods) == 0 {
            return
        }

        // Last module in previous chunk can be returned in this chunk.
        if mods[0] == lastMod {
            mods = mods[1:]
        }

        // We are done of there are no results.
        if len(mods) == 0 {
            return
        }

        for _, m := range mods {
            fmt.Println(m.Path, m.Version)
        }

        lastMod = mods[len(mods)-1]
    }
}

本篇关于《Go 模块是否包含元数据存储?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>