从strings包中学习用于处理int类型溢出的方法

用Golang发生溢出

golang中的int类型的最大值为2147483647,超过此值会发生溢出。

在动作上:
* 在定义时指定2147483647以上的值会导致编译失败
* 进行算术运算会发生溢出,但编译仍然通过。

因此,如果存在四则运算,就需要采取溢出保护措施。

从 strings.Repeat 中学习

以下是`strings.Repeat`的操作方式:

“`go
package main

import (
“fmt”
“strings”
)

func main() {
str := “Hello, 世界!”
repeatedStr := strings.Repeat(str, 3)
fmt.Println(repeatedStr)
}
“`

输出结果为:`Hello, 世界!Hello, 世界!Hello, 世界!`

请注意:为了让代码正常运行,您需要访问您提供的链接,并结合Playground环境运行代码。

这次我们来看一下标准包strings. Repeat的解决方法。

防止溢出

func Repeat(s string, count int) string {
    // Since we cannot return an error on overflow,
    // we should panic if the repeat will generate
    // an overflow.
    // See Issue golang.org/issue/16237
    if count < 0 {
        panic("strings: negative Repeat count")
    } else if count > 0 && len(s)*count/count != len(s) {
        panic("strings: Repeat count causes overflow")
    }

    b := make([]byte, len(s)*count)

请提供的链接显示有关Go语言中字符串相关函数的源代码。为了解释这段代码,请提供原文或相关上下文。

以下是重要的工作。

} else if count > 0 && len(s)*count/count != len(s) {
b := make([]byte, len(s)*count)

当发生溢出时,由于产生了预期之外的值(无法想出更好的措辞),len(s)*count的结果将为非预期值,因此len(s)*count/count != len(s)将成为真。

如果你看了这个链接,应该就会明白。

广告
将在 10 秒后关闭
bannerAds