#stdlib #golang #go

ggstd

Go标准库的部分实现

10个版本

0.1.0 2023年11月11日
0.0.9 2023年11月10日
0.0.7 2023年10月22日
0.0.3 2023年9月30日
0.0.2 2023年7月15日

#438 in 算法

Download history 42/week @ 2024-04-02 76/week @ 2024-07-02 22/week @ 2024-07-09

每月 98 次下载

BSD-3-Clause

3MB
29K SLoC

Rust 26K SLoC // 0.7% comments GNU Style Assembly 2.5K SLoC // 0.1% comments Go 475 SLoC // 0.5% comments

Rust中Go标准库的部分实现

这是将Go标准库的一些功能移植到Rust的尝试。

原因

  • 可以使Go程序员更容易过渡到Rust
  • 虽然Rust生态系统中有许多库覆盖了各种需求(见 https://crates.io/),但选择合适的库需要花费时间。如果能有一个类似于Go标准库的东西——简单、全面且经过良好测试那就太好了。

如果你考虑使用这个库,请注意以下事项

  • 代码质量可能低于Go库
  • 代码测试较少
  • 缺少一些优化,因此性能可能低于预期

使用示例

你可以使用以下命令运行这些示例

cargo run --example flate
go run goexamples/flate/main.go

cargo run --example user
go run goexamples/user/main.go

请参阅examples文件夹中的所有Rust示例和相应的Go示例goexamples文件夹。

部分实现模块

  • bufio
  • builtin
  • bytes
  • compress
  • compress::flate
  • compress::gzip
  • compress::zlib
  • crypto
  • crypto::aes
  • crypto::cipher
  • crypto::hmac
  • crypto::md5
  • crypto::rand
  • crypto::sha1
  • crypto::sha256
  • crypto::subtle
  • encoding
  • encoding::base64
  • encoding::binary
  • encoding::hex
  • errors
  • hash
  • hash::adler32
  • hash::crc32
  • image
  • image::color
  • image::color/palette
  • image::draw
  • image::png
  • internal
  • internal::bytealg
  • internal::syscall
  • internal::syscall/unix
  • io
  • math
  • math::bits
  • math::rand
  • os
  • os::user
  • runtime
  • strconv
  • strings
  • syscall
  • time
    • 限制
      • 无时区支持
      • 无持续时间支持
      • 无格式化支持
      • 无单调时间支持
  • unicode
  • unicode::utf8

支持的最小Rust版本

1.70.0

开发过程

当需要某个功能时,适当的Go源代码从go1.20.11中复制并翻译成Rust。

从Go到Rust的转换过程中发生变化

  • 结构和函数被重命名以符合Rust的命名约定
  • Go的Reader和Writer接口的使用被Rust的std::io::Readstd::io::Write接口所替代。这使得代码更加符合Rust的风格,并与Rust生态系统中的其他部分更加兼容。
  • 创建对象的函数被关联函数所替代。例如,Go的NewObject()被改为Rust的Object::new()
  • 返回Go接口的函数通常改为返回特定类型,因为在Go中,将接口转换为底层类型很容易,但在Rust中并不总是可能。

需要注意的问题

'<<'运算符的优先级不同

Go: 1 << 1 + 1 == 3 Rust: 1 << 1 + 1 == 4

发布清单

  • 没有由cargo doccargo clippycargo clippy --tests生成的警告。

许可证

大部分代码与Go项目使用的许可证相同(BSD 3-Clause):见LICENSE

有一小部分代码在MIT许可证下:src/winapi_.rssrc/libc_.rs

如何将许可证应用于新文件

当新文件包含从Go代码库复制的内容时,在文件顶部添加以下内容

// Copyright 2023 The rust-ggstd authors.
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

当文件没有从Go代码库复制任何内容,且是examplesgoexamples中的示例时,添加以下内容

// Copyright 2023 The rust-ggstd authors.
// SPDX-License-Identifier: 0BSD

当文件没有从Go代码库复制任何内容,且不是示例时

// Copyright 2023 The rust-ggstd authors.
// SPDX-License-Identifier: BSD-3-Clause

没有运行时依赖