数据类型转换

* 本页面主要介绍Go语言数据类型转换的相关内容。

类型转换就是将一种数据类型的变量转换为另外一种类型的变量。

有过C语言基础的同学一定知道,在C语言当中,有隐式类型转换和显示类型转换之分。但是在Go语言中,没有隐式类型转换。这一点要首先区分并明确开来。

Go语言中的类型转换只有2种

  • 强制类型转换
  • 类型断言
一、强制类型转换

下面的示例代码向大家展示了在Go语言中的强制类型转换:

  package main

  import "fmt"

  func main() {
      var a float32 = 5.6
      var b int = 10
      //这样写无法通过编译,会报错,因为类型不匹配
      fmt.Println (a * b)
      //需要进行强制转换
      fmt.Println (a * float32(b))
  }

强制类型转换的语法很简单:

  //T为类型,x为表达式
  T(x)
  
  //例子
  var a int32  = 10
  var b int64 = int64(a)
  var c float32 = 12.3
  var d float64 =float64(c)

低精度转换为高精度时是安全的,高精度的值转换为低精度时会丢失精度

二、类型断言

之前我们在 类型断言 这一章节讲过如何进行类型判断。在这里只讲一种用法:

  func main() {
      var a interface{} =10
      switch a.(type){
      case int:
              fmt.Println("int")
      case float32:
              fmt.Println("string")
      }
  }
三、适用频率很高的类型转换总结

这里我们总结几个在日常开发中经常用的到的类型转换的写法。

指针类型转换
  var a int =10
  var b *int =&a
  //此种写法会报错,编译器会提示cannot convert p (type *int) to type *int64
  var c *int64 = (*int64)(p)
  //正确的写法是我们需要用到unsafe包中的函数
  var c *int64 = (*int64)(unsafe.Pointer(b))
  fmt.Println(*c)
数字、字符、布尔值转字符串
  //可以使用fmt.sprintf进行转换,%q表示双引号括起来的字符串面值
  var(
     num4 = 1
     num5 = 3.44
     char = 'w'
     bl = true
     str1  string
  )
 //int-->>string
  str1 =fmt.Sprintf("%d",num4)
  fmt.Printf("str=%q",str1)
  //也可以使用strconv包的Itoa()
  println("a" + strconv.Itoa(32))  // a32
  // float-->>string
  str1 = fmt.Sprintf("%f",num5)
  fmt.Printf("str=%q",str1)
 
 //str-->>sting
  str1 = fmt.Sprintf("%c",char)
  fmt.Printf("str=%q",str)
  //bool-->>string
  str1 = fmt.Sprintf("%t",bl)
  fmt.Printf("str=%q",str1)
字符串转数字、字符、布尔值
  //用strconv包的函数进行转换
  var(
       str2 = "true"
       b1 bool
       str3 = "122333"
       n1 int64
       str4 = "23.33"
       n2 float64
    )
    //string转bool,%v是展示值的默认格式
    //ParseBool(变量名),(值,报错)
    b1,_ = strconv.ParseBool(str2)
    fmt.Printf("b=%v",b1)
 
    //string转int
    //ParseInt(变量名,显示进制(10进制),多少位(int8/16/32/64)),(值int64,报错)
    n1,_ = strconv.ParseInt(str3,10,64)
    fmt.Printf("n1=%v",n1)
    //Atoi()
    i,_ := strconv.Atoi("3")
    println(3 + i)   // 6
 
    //string转float
    //ParseFloat(变量名,位数flaot32/64),(值float64,报错)
    n2,_ = strconv.ParseFloat(str4,64)
    fmt.Printf("n2=%v",n2)
  }
四、时间格式化
  package main
     
  import (
      "fmt"
      "time"
  )
  func main() {
     
      currentTime := time.Now()
     
      fmt.Println("Current Time in String: ", currentTime.String())
         
      fmt.Println("MM-DD-YYYY : ", currentTime.Format("01-02-2006"))
         
      fmt.Println("YYYY-MM-DD : ", currentTime.Format("2006-01-02"))
         
      fmt.Println("YYYY.MM.DD : ", currentTime.Format("2006.01.02 15:04:05"))
         
      fmt.Println("YYYY#MM#DD {Special Character} : ", currentTime.Format("2006#01#02"))
         
      fmt.Println("YYYY-MM-DD hh:mm:ss : ", currentTime.Format("2006-01-02 15:04:05"))
             
      fmt.Println("Time with MicroSeconds: ", currentTime.Format("2006-01-02 15:04:05.000000"))
         
      fmt.Println("Time with NanoSeconds: ", currentTime.Format("2006-01-02 15:04:05.000000000"))
         
      fmt.Println("ShortNum Month : ", currentTime.Format("2006-1-02"))
         
      fmt.Println("LongMonth : ", currentTime.Format("2006-January-02"))
         
      fmt.Println("ShortMonth : ", currentTime.Format("2006-Jan-02"))
         
      fmt.Println("ShortYear : ", currentTime.Format("06-Jan-02"))
         
      fmt.Println("LongWeekDay : ", currentTime.Format("2006-01-02 15:04:05 Monday"))
         
      fmt.Println("ShortWeek Day : ", currentTime.Format("2006-01-02 Mon"))  
         
      fmt.Println("ShortDay : ", currentTime.Format("Mon 2006-01-2"))
         
      fmt.Println("Short Hour Minute Second: ", currentTime.Format("2006-01-02 3:4:5"))  
         
      fmt.Println("Short Hour Minute Second: ", currentTime.Format("2006-01-02 3:4:5 PM"))   
         
      fmt.Println("Short Hour Minute Second: ", currentTime.Format("2006-01-02 3:4:5 pm"))   
  }

输出结果是:

  Current Time in String: 2017-07-04 00:47:20.1424751 +0530 IST
MM-DD-YYYY : 07-04-2017
YYYY-MM-DD : 2017-07-04
YYYY.MM.DD : 2017.07.04 00:47:20
YYYY#MM#DD {Special Character} : 2017#07#04
YYYY-MM-DD hh:mm:ss : 2017-07-04 00:47:20
Time with MicroSeconds: 2017-07-04 00:47:20.142475
Time with NanoSeconds: 2017-07-04 00:47:20.142475100
ShortNum Month : 2017-7-04
LongMonth : 2017-July-04
ShortMonth : 2017-Jul-04
ShortYear : 17-Jul-04
LongWeekDay : 2017-07-04 00:47:20 Tuesday
ShortWeek Day : 2017-07-04 Tue
ShortDay : Tue 2017-07-4
Short Hour Minute Second: 2017-07-04 12:47:20
Short Hour Minute Second: 2017-07-04 12:47:20 AM
Short Hour Minute Second: 2017-07-04 12:47:20 am

* 本页内容参考以下数据源:

  • 《Go程序设计语言》
  • https://studygolang.com/articles/21591
  • https://www.runoob.com/go/go-type-casting.html
  • https://golang.org/pkg/strconv/
  • https://www.cnblogs.com/f-ck-need-u/p/9863915.html
  • https://www.golangprograms.com/get-current-date-and-time-in-various-format-in-golang.html

凯冰科技 · 代码改变世界,技术改变生活
Next Page→