Golang源码探索之旅:让我们一起开始吧!

Golang源码探索之旅:让我们一起开始吧! 作为我成为Go贡献者并带领社区共同参与的宏伟计划的一部分,我将把Go论坛作为我们规划和协调的基地。

我将通过这个主题帖持续向大家通报进展,并开设新帖子为各项任务提供协作空间。欢迎大家随时提出自己的想法并创建新主题!

  • 了解go工具链中依赖管理的现状并进行实践
  • 掌握正在开发中的功能更新动态
  • 如何成为Go代码审查员
  • 支持并深入了解雅典项目
  • 随着进展将陆续添加更多内容!

虽然我不是本论坛的版主,但建议关于dep、vgo原型或对我个人的讨论请另开新帖,这样新成员能更方便地找到参与信息。

感谢! ❤️


[gophersource] 从源码构建Go


更多关于Golang源码探索之旅:让我们一起开始吧!的实战教程也可以访问 https://www.itying.com/category-94-b0.html

11 回复

我到了!<3

更多关于Golang源码探索之旅:让我们一起开始吧!的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


哎呀,直到会议结束后才看到这个。我会尽量参加未来的某次会议来熟悉情况。感谢提供的信息。

Aarti (classyhacker) 向我推荐了 Kevin Burke 的 成为 Go 贡献者 演讲。 100

这正是我喜欢在Go社区看到的景象!我热爱这种积极的氛围。我很乐意提供帮助。我们还可以增加"支持并深入了解Athens项目"的内容。如果我没有记错的话,我记得读到过Ketelson先生和团队正在开发一个通过某种Web界面来支持vgo的项目。请原谅我缺乏具体细节,因为我还没有开始深入研究。

// 代码示例保留原文

2个赞

@wolves 我是Athens项目的维护者!很高兴你提到这个项目。我们已经进行了几个月,现在有了一个原型。我会专门开一个新帖子来讨论这个话题,但我们的第一次每周开发者会议将在30分钟后开始(美国太平洋时间上午11点)。

如果你和其他感兴趣的朋友能来参加,我会非常高兴!

详情请见:https://docs.google.com/document/d/1xpvgmR1Fq4iy1j975Tb4H_XjeXUQUOAvn0FximUzvIk/edit#heading=h.j77t62eely05

wolves:

我们还可以增加"支持并深入了解雅典项目"。

是的,说得很好,Chris!@bketelsen、Erik St. Martin 和 @arschles(还有更多人,但我只认识这些!)都在致力于雅典项目/olympus:实现代理和注册中心,以避免社区中再出现"go-bindata"事件。😉

我们都在做本质上相同的事情:停止等待,开始在Go社区中实现我们所需的功能。我会联系那些人,想办法让他们在这个论坛上创建账户,这样合作起来会更方便一些。

我非常喜欢你的倡议 @carolynvs 😍
我每天都在公司使用 Go 语言工作,一直在寻找如何为这门出色的语言做出贡献。阅读了你关于Gopher 源码探索之旅从源码构建 Go的博文后,我决定加入进来 🙂
这是我在这个论坛的第一篇帖子,今天我将花一整天时间安装 Go 1.11beta2、测试 vgo,最后深入了解 Athens 项目。
再次感谢这个社区。

fsilberstein:

我决定加入

太棒了!🎉 我还没试过beta2版本,但很期待不用再冒险使用master分支了。

Athens已经非常接近可以在本地使用的状态了。不过要提醒一下,目前还没完全准备好。我们正在等待"同步"功能的实现(即当代理缓存中没有某个包时,会从github获取)。值得关注的问题有个很有趣的名字叫"The Big Kahuna"😂 Big Kahuna: Do cache fills synchronously · Issue #290 · gomods/athens · GitHub

我正在与Athens团队紧密合作,等它准备好让我们试用时,我会开个新帖子来讨论如何使用Athens!

我想做的第一件事是使用我自己构建的Go版本来尝试新的Athens项目。我会在这篇文章中更新我的进展!

7月4日黑客周目标

  1. 从源代码构建Go
  2. 弄清楚如何自己运行Athens项目服务器
  3. 创建一个示例仓库,使用新的原生Go依赖管理以及Athens代理

延伸目标(如果整周气温都超过100华氏度)

  1. 尝试Athens项目中的包注册功能
  2. 将我在设置过程中学到的任何内容贡献到Athens项目的文档中!

我今天要弄清楚如何构建Go,并在[gophersource] 从源代码构建Go中发布我的失败、失误和成功。完成后,我会将其整理成一篇博客文章。希望你自己也尝试一下,如果遇到问题,请在那个帖子中寻求帮助!

对于有兴趣为 Go 社区代理和注册表项目做贡献的朋友,请前往 Athens 主题帖了解如何加入。

The Athens Project Technical Discussion

大家好!

@carolynvs她的主题帖中提到了 Athens 项目。一些朋友联系我询问该项目及参与方式,因此我决定为大家撰写这篇说明!

我们正在构建包含两个组件的 Go 模块仓库:

Olympus - Go 的中心模块仓库

Zeus - 模块代理

关于 Olympus 的简要介绍 我们计划将 Olympus 打造为 Go 模块的中心仓库。它实现了 vgo 提案中的下载协议,因此当有…

这是一个非常令人兴奋的计划!作为Go语言社区的一员,我很高兴看到你致力于推动更多人参与Go生态系统的贡献。以下是对你提到的几个技术方向的深入解析和示例代码,希望能帮助社区成员更好地参与:

依赖管理实践

Go模块现在是标准的依赖管理方案。以下是一个实际的模块使用示例:

// go.mod
module github.com/yourusername/example

go 1.21

require (
    github.com/gin-gonic/gin v1.9.1
    golang.org/x/sync v0.3.0
)

// main.go
package main

import (
    "fmt"
    "net/http"
    
    "github.com/gin-gonic/gin"
    "golang.org/x/sync/errgroup"
)

func main() {
    router := gin.Default()
    router.GET("/hello", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{
            "message": "Hello GopherSource!",
        })
    })
    
    var g errgroup.Group
    g.Go(func() error {
        return router.Run(":8080")
    })
    
    if err := g.Wait(); err != nil {
        fmt.Printf("Server error: %v\n", err)
    }
}

开发中功能跟踪

要了解Go开发中的功能,可以查看Go项目的Issue和Proposal:

// 示例:使用泛型(Go 1.18+ 特性)
package main

import "fmt"

// 泛型栈实现
type Stack[T any] struct {
    items []T
}

func (s *Stack[T]) Push(item T) {
    s.items = append(s.items, item)
}

func (s *Stack[T]) Pop() (T, bool) {
    if len(s.items) == 0 {
        var zero T
        return zero, false
    }
    item := s.items[len(s.items)-1]
    s.items = s.items[:len(s.items)-1]
    return item, true
}

func main() {
    var stringStack Stack[string]
    stringStack.Push("Gopher")
    stringStack.Push("Source")
    
    if item, ok := stringStack.Pop(); ok {
        fmt.Println("Popped:", item) // 输出: Popped: Source
    }
}

Go代码审查入门

要参与Go代码审查,首先需要理解Go的代码风格和最佳实践:

// 良好的Go代码示例
package httpclient

import (
    "context"
    "fmt"
    "io"
    "net/http"
    "time"
)

// Client 封装HTTP客户端操作
type Client struct {
    baseURL    string
    httpClient *http.Client
}

// NewClient 创建新的HTTP客户端
func NewClient(baseURL string, timeout time.Duration) *Client {
    return &Client{
        baseURL: baseURL,
        httpClient: &http.Client{
            Timeout: timeout,
        },
    }
}

// Get 执行GET请求
func (c *Client) Get(ctx context.Context, path string) ([]byte, error) {
    req, err := http.NewRequestWithContext(ctx, "GET", c.baseURL+path, nil)
    if err != nil {
        return nil, fmt.Errorf("creating request: %w", err)
    }
    
    resp, err := c.httpClient.Do(req)
    if err != nil {
        return nil, fmt.Errorf("executing request: %w", err)
    }
    defer resp.Body.Close()
    
    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf("unexpected status: %s", resp.Status)
    }
    
    body, err := io.ReadAll(resp.Body)
    if err != nil {
        return nil, fmt.Errorf("reading response: %w", err)
    }
    
    return body, nil
}

雅典项目集成

雅典作为Go模块代理,可以这样集成:

// 使用雅典代理的配置
package main

import (
    "fmt"
    "os"
    "os/exec"
)

func setupAthensProxy() error {
    // 设置GOPROXY环境变量使用雅典
    os.Setenv("GOPROXY", "https://athens.azurefd.net")
    
    // 验证设置
    cmd := exec.Command("go", "env", "GOPROXY")
    output, err := cmd.Output()
    if err != nil {
        return fmt.Errorf("failed to check GOPROXY: %w", err)
    }
    
    fmt.Printf("Current GOPROXY: %s", output)
    return nil
}

func main() {
    if err := setupAthensProxy(); err != nil {
        fmt.Printf("Error setting up Athens: %v\n", err)
        return
    }
    
    // 现在go get/mod命令将通过雅典代理
    fmt.Println("Athens proxy configured successfully")
}

从源码构建Go

构建Go源码的基本步骤:

# 克隆Go源码
git clone https://go.googlesource.com/go
cd go/src

# 设置环境变量
export GOROOT_BOOTSTRAP=$(go env GOROOT)

# 编译Go
./make.bash

# 验证新构建的Go
./go version

期待看到这个计划的更多进展!这些技术示例应该能为社区成员提供实际的切入点来参与Go生态系统的贡献。

回到顶部