Go语言快速入门7|青训营

73 阅读2分钟

类型之间的转换

一、类型不能混着用

连接两个字符串,使用 + 运算符:

countdown := "launch in T minus " + "10 seconds."

如果想连接字符串和数值,是会报错的:

countdown := "Launch in T minus " + 10 + "seconds."

整数和浮点类型也不能混着用:

age := 41   //整型
marsDays := 687   //整型
earthDays := 365.2425   //浮点类型
fmt.Println("I am", age*earthDays/marsDays, "year old on Mars.")

二、数值类型间的转换

下例中,如果想把ago转化为浮点型,需要使用目标类型将其“包裹”起来:

age := 41
marsAge := float64(age)

1、从浮点类型转化为整数类型

可以从浮点类型转化为整数类型,小数点后边的部分会被截断,而不是舍入

earthDays := 365.2425
fmt.Println(int(earthDays))

无符号和有符号整数类型之间也需要转换

不同大小的整数类型之间也需要转换

2、类型转换是需要谨慎

(1)环绕行为

var bh float = 32768
var h = int16(bh)   //int16最大值32767
fmt.Println(h)  //-32768

可以通过math包提供的max、min常量,来判断是否超过最大最小值

var bh float64 = 32768
if bh < math.MinInt16 || bh > math.MaxInt16{
      // handle out of range value
}

3、字符串之间的转换

想把rune、byte转化为string,语法是一样的:

var pi rune = 960
var alpha rune = 940
var omega rune = 969
var bang byte = 33

fmt.Print(string(pi),string(alpha), string(omega), string(bang))  //πáω!

想把数值转化为string,它的值必须能转化为code point.

strconv包的Itoa函数就可以做这件事:、

coubtdown := 10
str := "Launch in T minus " + strconv.Itoa(countdown) + " seconds."
fmt.Println(str)  //Launch in minus 10 seconds.

Itoa是Integer to ASCLL的意思

Unicode是ASCII的超集,它们前128个code points 是一样的(数字、英文字母、常用标点)。

另外一种把数值转化为string的方式是使用Sprinkf函数,和Printf类似,但是会返回一个string:

countdown := 9
str := fmt.Sprintf("Launch in T minus %v seconds.",countdown)\
fmt.Println(str)  //Lanuch in T minus 9 seconds.

strconv包里面还有个Atoi(ASII to Integer)函数

由于字符串里面可能包含任意字符串,或者要转换的数字字符串太大,所以Atoi函数可能会发生错误:

 countdown, err := strconv.Atoi("10")
 if err ≠ nil {
     //oh no,something went wrong
  }
  fmt.Println(countdown)

如果err的值为nil,那么就代表没发生错误。

注意!Go是静态类型语言,一旦某个变量被声明,那么它的类型就无法再改变了。

三、布尔类型的转换

Print家族的函数,会把bool类型的值打印成true/false的文本

  launch := false
  
  launchText := fmt.Sprintf("%v", launch)
  fmt.Println("Ready for launch:", launchText)
  
  var yesNo string
  if launch {
      yesNo = "yes"
  } else {
      yesNo = "no"
  }
  fmt.Println("Ready for launch:",yesNo)
  //Ready for launch: false
    Ready for launch: no

注意:如果想使用string(false),int(false); bool(1),bool("yes")等类型的方式进行转换,那么Go编译器会报错

某些语言里,经常把1和0当做true和false,但是在Go里面不行