分类 技术志 下的文章

重拾精髓:go doc -http让离线包文档浏览更便捷

本文永久链接 – https://tonybai.com/2024/09/06/go-doc-add-http-support

Go语言团队近期接受了Go团队成员、Go圣经《The Go Programming Language》合著者Alan Donovan新提案,旨在进一步提升开发者体验。这个提案为go doc命令新增了一个强大的功能:通过go doc -http,开发者可以快速启动一个本地的文档服务器,并自动在浏览器中打开Go包的参考文档。该功能为开发者提供了类似pkg.go.dev的离线文档展示形式,同时增强了查看本地文档的交叉引用功能。看到这个提案功能,屏幕前的资深Gopher是不是感觉似曾相识呢:)。

早在去年,我就写过一篇有关go包文档查看方式对比的文章《聊聊godoc、go doc与pkgsite》,在那篇文章中,我就对当前Go包文档查看的几种方式做了详细说明,如果你是Go初学者,不妨点击链接移步过去仔细阅读一番。当然,这里也会简单地再介绍一下Go包文档离线查看工具的演进。

Go语言的包文档查看工具经历了三个重要阶段的演进,分别是godocgo docpkgsite。以下是这些工具的发展历程:

godoc是Go语言最早用于查看包文档的工具。它支持通过命令行查看文档,也可以通过-http参数启动一个本地文档服务器,用户在浏览器中以网页形式查看文档。这个工具提供了较为完整的Go包文档浏览体验,支持交叉引用和导航。但随着Go的发展,逐渐不再是官方推荐的工具,并且不再随Go安装包一并发布了!

随着Go的升级与演进,go doc逐渐取代了godoc成为查看包文档的主要工具。go doc主要提供了通过命令行输出包详细文档的能力,对应简单的包查询,这种方式更为高效:

$go doc -h
Usage of [go] doc:
    go doc
    go doc <pkg>
    go doc <sym>[.<methodOrField>]
    go doc [<pkg>.]<sym>[.<methodOrField>]
    go doc [<pkg>.][<sym>.]<methodOrField>
    go doc <pkg> <sym>[.<methodOrField>]
For more information run
    go help doc

Flags:
  -C dir
        change to dir before running command
  -all
        show all documentation for package
  -c    symbol matching honors case (paths not affected)
  -cmd
        show symbols with package docs even if package is a command
  -short
        one-line representation for each symbol
  -src
        show source code for symbol
  -u    show unexported symbols as well as exported

然而从上面的usage输出来看,go doc版本去除了godoc堪称精髓能力的-http支持,开发者无法像godoc那样启动本地文档服务器,这在某种程度上减少了它的可视化文档浏览功能。

pkgsite是目前官方推荐的在线Go包文档浏览工具,提供了一个全面、易于导航的网站(pkg.go.dev),用户可以在浏览器中查看各个Go包的文档、函数、类型等信息。它大大提升了开发者的体验,提供了丰富的交叉引用和包依赖信息。

pkgsite也是go官方站,主要用于在线查看,虽然也支持离线查看功能。但就像Alan Donovan在issue提到的那样:pkgsite程序目前相当大且启动缓慢,并且pkgsite最初被设计为一个可以在Google Cloud上运行的长生命周期的服务器,有很多外部依赖和耦合。

为了满足诸多Gopher通过浏览器web方式离线浏览Go包参考手册的需求,弥补pkgsite过于缓慢和庞大的不足,Alan Donovan提出了让离线文档服务能力回归的issue。没错!这个提案其实就是godoc -http这个经典的、精髓功能的“重生”。

这一新增功能有望在Go 1.24或之后的版本中正式推出,届时,新增的go doc -http功能会让离线文档服务的能力回归,为开发者提供了更多选择与灵活性。但目前go doc -http的具体命令接口形式尚未确定,但可以确定的是,通过该命令,用户无需再依赖第三方工具或访问外部网站,即可在本地查看项目的完整文档。这不仅提升了效率,也让开发者更方便地查找包文档以及包间的交叉引用,实现更直观的包依赖管理。Go开发者们可以尽情享受这一强大的本地文档浏览工具。


Gopher部落知识星球在2024年将继续致力于打造一个高品质的Go语言学习和交流平台。我们将继续提供优质的Go技术文章首发和阅读体验。同时,我们也会加强代码质量和最佳实践的分享,包括如何编写简洁、可读、可测试的Go代码。此外,我们还会加强星友之间的交流和互动。欢迎大家踊跃提问,分享心得,讨论技术。我会在第一时间进行解答和交流。我衷心希望Gopher部落可以成为大家学习、进步、交流的港湾。让我相聚在Gopher部落,享受coding的快乐! 欢迎大家踊跃加入!

img{512x368}
img{512x368}

img{512x368}
img{512x368}

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻) – https://gopherdaily.tonybai.com

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite
  • Gopher Daily归档 – https://github.com/bigwhite/gopherdaily
  • Gopher Daily Feed订阅 – https://gopherdaily.tonybai.com/feed

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

Go 1.18之后的语法新特性Quiz,你能做对几个?

本文永久链接 – https://tonybai.com/2024/08/27/a-new-syntax-quiz-after-go-1-18

Go 1.18版本以来,Go语言引入了许多令人兴奋,但也可能令你感觉难以理解的语法新特性。这些特性大大增强了语言的表达能力,但也增加了学习曲线。今天,我们通过几个小Quiz来测试你对这些新特性的理解。准备好挑战自己了吗?答案在文章末尾公布,但请先尝试独立思考每个问题!

注:为了保证答案一致,这里的答案输出都是基于刚发布没多久的Go 1.23.0版本

Quiz 1: 泛型与类型集合(Go 1.18

import (
    "fmt"
    "golang.org/x/exp/constraints"
)

type Scalar interface {
    constraints.Integer | constraints.Float | ~string
}

func Plus[T Scalar](a, b T) T {
    return a + b
}

type MyString string

func main() {
    fmt.Println(Plus(1, 2))
    fmt.Println(Plus(1.5, 2.7))
    fmt.Println(Plus("Hello, ", "World"))
    fmt.Println(Plus(MyString("Go "), MyString("1.18+")))
}

问题:上述代码会输出什么?

  • A) 编译错误,MyString类型不满足Scalar接口
  • B) 3
    4.2
    Hello, World
    Go 1.18+
  • C) 3
    4.2
    Hello, World
    编译错误,MyString类型不能进行加法操作
  • D) 编译错误,不能对不同类型(如int和float64)使用同一个Plus函数

Quiz 2: 修正后的循环变量语义(Go 1.22

func main() {
    s := []string{"a", "b", "c"}
    funcs := make([]func(), len(s))
    for i, v := range s {
        funcs[i] = func() {
            fmt.Printf("%d: %s\n", i, v)
        }
    }
    for _, f := range funcs {
        f()
    }
}

问题:在Go 1.22中,这段代码最可能的输出是什么?

  • A) 0: c
    1: c
    2: c
  • B) 0: a
    1: b
    2: c
  • C) 输出不确定,可能是A或B中的任何一种
  • D) 编译错误,因为在闭包中使用循环变量

Quiz 3: range over int(Go 1.22

func generateSequence(n int) []int {
    seq := make([]int, n)
    for i := range n {
        seq[i] = (i * i) % 10
    }
    return seq
}

func main() {
    fmt.Println(generateSequence(7))
}

问题:这段代码会输出什么?

  • A) [0 1 4 9 16 25 36]
  • B) [0 1 4 9 6 5 6]
  • C) [0 1 2 3 4 5 6]
  • D) 编译错误,不能对int类型使用range

Quiz 4: range-over-func(Go 1.23

import (
    "iter"
    "fmt"
)

func fibonacci() iter.Seq[int] {
    a, b := 0, 1
    return func(yield func(int) bool) {
        for {
            if !yield(a) {
                return
            }
            a, b = b, a+b
        }
    }
}

func main() {
    count := 0
    for v := range fibonacci() {
        if count == 7 {
            break
        }
        fmt.Printf("%d ", v)
        count++
    }
}

问题:假设启用了相关实验特性,这段代码会输出什么?

A) 0 1 1 2 3 5 8
B) 0 1 2 3 4 5 6
C) 1 1 2 3 5 8 13
D) 编译错误,iter.Seq不是一个合法的迭代器

Quiz 5: 带类型参数的别名(试验特性,Go 1.23

注:下面示例使用GOEXPERIMENT=aliastypeparams go run 运行

package main

import "fmt"

type Pair[T, U any] = struct {
    First  T
    Second U
}

func MakePair[T, U any](first T, second U) Pair[T, U] {
    return Pair[T, U]{First: first, Second: second}
}

func SwapPair[T, U any](p Pair[T, U]) Pair[U, T] {
    return Pair[U, T]{First: p.Second, Second: p.First}
}

func main() {
    intStringPair := MakePair(42, "Answer")
    swappedPair := SwapPair(intStringPair)
    fmt.Printf("Swapped Int-String Pair: %+v\n", swappedPair)
}

问题:假设启用了相关实验特性,这段代码的结果是什么?

A) Swapped Int-String Pair: {First:Answer Second:42}
B) Swapped Int-String Pair: {First:42 Second:Answer}
C) 运行时错误,类型推导失败
D) 编译错误,不支持带类型参数的别名

这些Quiz涵盖了Go 1.18以来的一些重要新特性,包括泛型、修正的循环变量语义、range over int、range-over-func以及类型参数别名。如果你能正确回答大部分问题,那么恭喜你,你对Go的新特性已经有很好的理解了!

注:关注公众号iamtonybai,回复“go1.23quiz”,即可获得这五道题目的正确答案。


Gopher部落知识星球在2024年将继续致力于打造一个高品质的Go语言学习和交流平台。我们将继续提供优质的Go技术文章首发和阅读体验。同时,我们也会加强代码质量和最佳实践的分享,包括如何编写简洁、可读、可测试的Go代码。此外,我们还会加强星友之间的交流和互动。欢迎大家踊跃提问,分享心得,讨论技术。我会在第一时间进行解答和交流。我衷心希望Gopher部落可以成为大家学习、进步、交流的港湾。让我相聚在Gopher部落,享受coding的快乐! 欢迎大家踊跃加入!

img{512x368}
img{512x368}

img{512x368}
img{512x368}

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻) – https://gopherdaily.tonybai.com

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite
  • Gopher Daily归档 – https://github.com/bigwhite/gopherdaily
  • Gopher Daily Feed订阅 – https://gopherdaily.tonybai.com/feed

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats