Go 1.15 候选版1正式发布:Golang新特性抢先体验

Go 1.15 候选版1正式发布:Golang新特性抢先体验 大家好,Gophers,

我们刚刚发布了 Go 1.15 的候选版本 go1.15rc1。 它是从 release-branch.go1.15 分支上,标签为 go1.15rc1 的修订版本创建的。

请使用新版本进行您的生产负载测试和单元测试。 您帮助测试这些预发布版本的工作是无价的。

请使用问题跟踪器报告任何问题:

GitHub Logo

更好地协作构建软件

GitHub 是人们构建软件的地方。超过 5000 万人使用 GitHub 来发现、复刻和参与超过 1 亿个项目。

如果您已经安装了 Go,尝试 go1.15rc1 最简单的方法是使用 go 命令:

$ go get golang.org/dl/go1.15rc1
$ go1.15rc1 download

您可以从通常的位置下载二进制和源代码发行版: https://golang.org/dl/#go1.15rc1

要了解 Go 1.15 中有哪些更改,请阅读发布说明草案: https://tip.golang.org/doc/go1.15

致意, Go 团队


更多关于Go 1.15 候选版1正式发布:Golang新特性抢先体验的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Go 1.15 候选版1正式发布:Golang新特性抢先体验的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go 1.15rc1 的发布确实带来了不少值得关注的改进。根据发布说明草案,这次更新主要集中在性能优化、工具链增强和运行时改进,而不是引入大量新语法特性。以下是一些关键变化:

1. 链接器性能显著提升 链接器现在更高效,内存占用减少,编译速度加快。这对于大型项目尤其有益。

// 虽然代码层面无变化,但编译体验会更好
package main

import "fmt"

func main() {
    fmt.Println("链接更快,内存更省")
}

2. 小对象分配优化 runtime 对小对象(<=256B)的分配进行了优化,减少了内存开销,这对高并发场景下的微服务性能有帮助。

package main

import (
    "runtime"
    "time"
)

type SmallStruct struct {
    ID    int
    Value [200]byte
}

func main() {
    // 大量小对象分配将受益
    for i := 0; i < 10000; i++ {
        _ = &SmallStruct{ID: i}
    }
    runtime.GC()
    time.Sleep(time.Millisecond)
}

3. GOPROXY 支持增量获取模块 go 命令现在可以更智能地使用代理,支持增量获取模块数据,提升依赖下载效率。

# 环境变量设置示例
export GOPROXY=https://goproxy.cn,direct
export GOSUMDB=sum.golang.org

4. 内联改进 编译器内联策略有所调整,现在会避免内联包含复杂循环的函数,这有助于减少二进制体积并可能提升性能。

package main

// 包含复杂循环的函数可能不再被内联
func process(items []int) int {
    sum := 0
    for i := 0; i < len(items); i++ {
        // 复杂循环体
        for j := 0; j < 10; j++ {
            sum += items[i] * j
        }
    }
    return sum
}

5. 工具链修复

  • go vet 现在能检测到更多的错误,例如 json.Marshal 调用 Error() 方法的问题。
  • -json-compiler 标志的支持有所改进。
package main

import (
    "encoding/json"
    "errors"
)

type MyError struct{}

func (e *MyError) Error() string { return "error" }

func main() {
    err := &MyError{}
    // go vet 可能会对以下调用给出更准确的警告
    b, _ := json.Marshal(err)
    _ = b
}

6. 核心库调整

  • time.Timertime.TickerStop 方法被调用后,通道不再被关闭,这修复了一个潜在的竞态条件。
  • encoding/json 在解码数字时性能有所提升。
package main

import (
    "encoding/json"
    "fmt"
    "time"
)

func main() {
    // time.Timer 行为更安全
    timer := time.NewTimer(100 * time.Millisecond)
    go func() {
        <-timer.C
        fmt.Println("Timer fired")
    }()
    if timer.Stop() {
        fmt.Println("Timer stopped")
    }
    // 此时 timer.C 不会被关闭

    // json 解码数字更快
    var data struct {
        Count int `json:"count"`
    }
    json.Unmarshal([]byte(`{"count": 1000000}`), &data)
}

建议按照官方指引进行测试,特别是关注性能敏感和依赖管理相关的部分。任何问题请及时在 GitHub issue 跟踪器反馈。

回到顶部