9.13 Golang不同类型比较

在日常开发过程中难免会遇到各个类型的变量的比较以及运算操作,这里我们做了一些简单的汇总,希望能给各位同学在开发中带来帮助。

这里先上一波关系运算符==,!=,<,<=,> 和 >=。

float浮点数比较

golang 支持两种浮点float32和float64,众所众知,涉及浮点数比较或运算是会遇到精度问题,具体要根据golang实现IEEE 754的情况定。

默认情况下,float32精度是小数后7位,float64精度是小数点后15位。

如例1:

  1. var a float32 = 1.00000001
  2. var b float32 = 1.000000000001
  3. var c float32 = 1.0000001
  4. var d float32 = 1.000000000001
  5. fmt.Println(a == b) //true
  6. fmt.Println(a > b) //false
  7. fmt.Println(c == d) //false
  8. fmt.Println(c > d) //true

float64

  1. var a float64 = 1.0000000000000001
  2. var b float64 = 1.000000000000000001
  3. var c float64 = 1.000000000000001
  4. var d float64 = 1.0000000000000000001
  5. fmt.Println(a == b) //true
  6. fmt.Println(a > b) //false
  7. fmt.Println(c == d) //false
  8. fmt.Println(c > d) //true

这里写了一个根据精度进行float比较的简单的类,注意最大精度为小数点后15位,超出会丢失精度。

示例:

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. type Floater struct {
  7. Accuracy float64 //精度,最大为小数点后15位
  8. }
  9. //是否相等
  10. func (f Floater) IsEqual(a, b float64) bool {
  11. return math.Abs(a-b) < f.Accuracy
  12. }
  13. //0为相等 1为a大于b -1为a小于b
  14. func (f Floater) Bccomp(a, b float64) int8 {
  15. if math.Abs(a-b) < f.Accuracy {
  16. return 0
  17. }
  18. if math.Max(a, b) == a {
  19. return 1
  20. } else {
  21. return -1
  22. }
  23. }
  24. func main() {
  25. f := Floater{Accuracy: 0.000000000001}
  26. var a float64 = 1.0000000002
  27. var b float64 = 1.0000000001
  28. fmt.Println(f.Bccomp(a, b)) //1
  29. fmt.Println(f.Bccomp(b, a)) //-1
  30. fmt.Println(f.Bccomp(a, a)) //0
  31. }

顺便讲一下如何实现保留小数点后2位如何实现

  1. //方法1
  2. a := 2.556
  3. v, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", a), 64)
  4. fmt.Println(v) //2.56
  5. //方法2
  6. v = math.Trunc(a*1e2+0.5) * 1e-2
  7. fmt.Println(v) //2.56
  8. //方法3
  9. n10 := math.Pow10(2)
  10. v = math.Trunc((a+0.5/n10)*n10) / n10
  11. fmt.Println(v)

指针类型比较

  1. a := "hello"
  2. b := &a
  3. c := &a
  4. fmt.Println(b == c)

当变量是相同或者都为nil时,指针值相等。

interface类型比较

  1. type I1 interface {
  2. f()
  3. }
  4. type I2 interface {
  5. f()
  6. }
  7. type S1 struct {
  8. name string
  9. }
  10. func (s S1) f() {
  11. }
  12. type S2 struct {
  13. name string
  14. }
  15. func (s S2) f() {
  16. }
  17. func main() {
  18. var a, b, c, d I1
  19. var e I2
  20. a = S1{"hello"}
  21. b = S1{"hello"}
  22. c = S1{"world"}
  23. d = S2{"hello"}
  24. fmt.Println(a == b) //true
  25. fmt.Println(a == c) //false
  26. fmt.Println(a == d) //false
  27. fmt.Println(a == e) //false
  28. }

比较 slice/struct/map

这三个都可以用reflect.DeepEqual来判断是否相等

  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. type S struct {
  7. s string
  8. }
  9. func main() {
  10. s1 := S{s: "hello"}
  11. s2 := S{s: "hello"}
  12. if reflect.DeepEqual(s1, s2) {
  13. fmt.Println(s1, "==", s2)
  14. }
  15. a1 := []int{1, 2}
  16. a2 := []int{1, 2}
  17. if reflect.DeepEqual(a1, a2) {
  18. fmt.Println(a1, "==", a2)
  19. }
  20. m1 := map[int]string{1: "a", 2: "b"}
  21. m2 := map[int]string{1: "a", 2: "b"}
  22. if reflect.DeepEqual(m1, m2) {
  23. fmt.Println(m1, "==", m2)
  24. }
  25. }

links

  • 目录
  • 上一节:
  • 下一节: