Loading... # 整型 Go中的整型分为有符号和无符号两大类,有符号的包含负值,无符号不包含负值。 有符号整型: * int8(-128 -> 127) * int16(-32768 -> 32767) * int32(-2,147,483,648 -> 2,147,483,647) * int64(-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,807) * int * 在 32 位操作系统上使用 32 位(-2,147,483,648 -> 2,147,483,647) 2**32 * 在 64 位操作系统上使用 64 位(-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,80)2**64 无符号整数: * uint8(0 -> 255) * uint16(0 -> 65,535) * uint32(0 -> 4,294,967,295) * uint64(0 -> 18,446,744,073,709,551,615) * uint * 在 32 位操作系统上使用32 位(0 -> 4,294,967,295) 2**32 * 64 位操作系统上使用 64 位(0 -> 18,446,744,073,709,551,615) 2**64 不同整型可表示的数据范围不同,我们需要根据自己的需求来选择适合的类型。 ## 整型之间的转换 ```go data := intXXX(其他整型) ``` ```go var v1 int8 = 10 var v2 int16 = 18 v3 := int16(v1) + v2 fmt.Println(v3, reflect.TypeOf(v3)) ``` 注意: * 地位转向高位,没问题。 * 高位转向低位,可能有问题 * ``` var v1 int16 = 130 v2 := int8(v1) fmt.Println(v2) ``` ## 整型与字符串的转换 ```go package main func main() { // 整型转换为字符串类型 v1 := 19 result := strconv.Itoa(v1) fmt.Println(result, reflect.TypeOf(result)) var v2 int8 = 17 // strconv.Itoa只能传int类型,如果是其他类型,需要先转换成int data := strconv.Itoa(int(v2)) fmt.Println(data,reflect.TypeOf(data)) // 字符串转换为整型:转换后是int类型;可能存在错误 v1 := "666" result, err := strconv.Atoi(v1) if err == nil { fmt.Println("转换成功", result,reflect.TypeOf(result)) } else { fmt.Println("转换失败") } } ``` ## 进制转换 * Go代码中: * 十进制,整型的方式存在。 * 其他进制,是以字符串的形式存在。 * 整形,10进制数。 十进制转换为其他进制: ```go package main import ( "fmt" "reflect" "strconv" ) func main() { v1 := 99 // 整型(十进制)转换为:二进制、八进制、十六进制 r1 := strconv.FormatInt(int64(v1), 16) fmt.Println(r1, reflect.TypeOf(r1)) } ``` 其他进制转换为十进制: ```go package main import ( "fmt" "reflect" "strconv" ) func main() { // data,要转换的文本 // 2,把文档当做二进制去转换成 十进制(整型) // 0,转换的过程中对结果进行约束,(0按照int方式去转换,16按照int16的方式去转换) // 结果:如果转换成功,则将err设置为nil,result则永远以int64的类型返回。 data := "1001000101" result, err := strconv.ParseInt(data, 2, 0) fmt.Print(result, err, reflect.TypeOf(result)) } ``` 提醒:通过ParseInt将字符串转换为10进制时,本质上与Atoi是相同的。  ## 常见数学运算 ```go package main import ( "fmt" "math" ) func main() { fmt.Println(math.Abs(-19)) // 取绝对值 fmt.Println(math.Floor(3.14)) // 向下取整 fmt.Println(math.Ceil(3.14)) // 向上取整 fmt.Println(math.Round(3.3478)) // 就近取整 fmt.Println(math.Round(3.5478*100) / 100) // 保留小数点后两位 fmt.Println(math.Mod(11, 3)) // 取余数,同11 % 3 fmt.Println(math.Pow(2, 5)) // 计算次方,如:2的5次方 fmt.Println(math.Pow10(2)) // 计算10次方,如:2的10次方 fmt.Println(math.Max(1, 2)) // 两个值,取较大值 fmt.Println(math.Min(1, 2)) // 两个值,取较小值 // ... } ``` ## 指针/nil/声明变量/new 声明变量 ```go var v1 int // v1没有设置默认值,则会默认为0 v2 := 999 ```  指针 ```go var v3 *int // v3保存的是nil的内存地址 v4 := new(int) // v4保存的是0的内存地址 ```  new关键字 new用于创建内存并进行内部数据的初始化,并返回一个指针类型。 nil ``` nil指go语言中的空值。 var v100 *int var v101 *int8 ``` 问题: 为什么要有指针? ``` 为了节省内存,不重复开辟空间去存储数据。 ``` int和*int是两种不同的数据类型,不等。 ## 超大整型 ### 第一步:创建对象 创建超大整型对象 ```go // 第一步:创建一个超大整型的一个对象 var v1 big.Int var v2 big.Int // 第二步:在超大整型对象中写入值 v1.SetInt64(9223372036854775807) fmt.Println(v1) // 更多的使用这个 v2.SetString("92233720368547758089223372036854775808", 10) fmt.Println(v2) ``` ```go // 第一步:创建一个超大整型的一个对象 v3 := new(big.Int) v4 := new(big.Int) // 第二步:在超大整型对象中写入值 v3.SetInt64(9223372036854775807) fmt.Println(v3) v4.SetString("92233720368547758089223372036854775808", 10) fmt.Println(v4) ``` 推荐:使用指针的方式,即:使用new来进行创建和初始化。 ### 第二步:加减乘除 超大对象进行加减乘除 ```go n1 := new(big.Int) n1.SetInt64(89) n2 := new(big.Int) n2.SetInt64(99) result := new(big.Int) result.Add(n1, n2) fmt.Println(result) ``` ```go n1 := big.NewInt(89) n2 := big.NewInt(99) result := new(big.Int) result.Add(n1, n2) fmt.Println(result) ``` ```go v1 := big.NewInt(11) v2 := big.NewInt(3) result := new(big.Int) // 加 result.Add(v1, v2) fmt.Println(result) // 减 result.Sub(v1, v2) fmt.Println(result) // 乘 result.Mul(v1, v2) fmt.Println(result) // 除(地板除,只能得到商) result.Div(v1, v2) fmt.Println(result) // 除,得商和余数 minder := new(big.Int) result.DivMod(v1, v2, minder) fmt.Println(result, minder) ``` ### 第三步:关于结果 ```go n1 := new(big.Int) n1.SetString("92233720368547758089223372036854775808", 10) n2 := new(big.Int) n2.SetString("11111192233720368547758089223372036854775808", 10) result := new(big.Int) result.Add(n1, n2) fmt.Println(result.String()) ``` ### 最后建议 * 尽量new方式去初始化并返回一个指针类型的方式。 * 易错的点(int类型和*int类型) ```go v1.SetString("92233720368547758089223372036854775808", 10) var v2 big.Int v2.SetString("2", 10) //result := new(big.Int) var result big.Int result.Add(&v1, &v2) fmt.Println(result.String()) ``` Last modification:March 2nd, 2021 at 09:39 pm © 允许规范转载 Support If you think my article is useful to you, please feel free to appreciate ×Close Appreciate the author Sweeping payments