0
点赞
收藏
分享

微信扫一扫

GO语言的数据类型

(作者:​​全栈工程师开发手册​​
Go语言是静态类型语言,这一点和Python不一样,Python是动态类型语言。也就是说,在使用Python时,即使你没有指定变量的类型,在执行代码的过程中,计算机也会自动将数据转换成合适的类型,而静态类型语言中,这样的操作可能会导致编译器报错。

1. 弱类型语言可能产生重大错误
在弱类型语言,比如JavaScript中,“+”运算符是可以应用于数字和字符串之间的,如果在脚本中使用了“+”运算符,并且没有指定入参和出餐类型,则可能导致当入参类型不同时,也可以相加,并存入数据库。比如本来要求将本月和上月的税额相加,并存入数据库,但数据库的结果列未规定为数值型,而输入上月税额时,不小心混入了字符串,比如打字打成了’abc’,那么最终数据库中的结果就会出现’123abc’这种形式的总税额。这是不可接受,但又很难发现的。使用Hive处理数据时,也常常会碰到这个问题。

这种问题通常出现在,我们需要灵活处理数据的情况,比如文本清洗,我们希望从文字中清洗出两个天数,并相加,但有时正则表达式写得不够准确,可能会清洗出一些字符串,但又需要保证能够将清洗出的内容正确存入数据库,后续再对不符合要求的结果进行判断,就可能会规定本该是数值型的变量为字符串型,但大部分情况下,这种存储方式,和弱类型的编程方式,是很容易出现错误的,并且很难检查。这也是强类型语言的优点,不容易出现这类错误,通常出现了,在编译阶段就能发现。

2. 强类型语言的类型声明
像C语言一样,Go语言在定义函数时,就会声明输入、输出变量的类型。

package main

import (
"fmt"
)

func sayHello(s string) string {
return "Hello " + s
}

func main() {
fmt.Println(sayHello("George"))
}

比如这里的sayHello函数,就声明了其输入变量s是一个字符串,出参也是字符串类型,但输入类型为数字时,就会报错。

package main

import (
"fmt"
)

func sayHello(s string) string {
return "Hello " + s
}

func main() {
fmt.Println(sayHello(1))
}

GO语言的数据类型_字符串


3. 布尔类型

布尔型变量声明和赋值:

package main

import (
"fmt"
)

func main() {
var a bool
a = true
fmt.Println(a)
}

布尔型变量默认值:false
布尔型变量可取值:true、false

4. 数值类型
整数声明方式:

var a int

浮点数声明方式:

var f float64 = 2.1

浮点数可以是32位,也可以是64位,推荐64位。

字符串声明方式:

var s string
s = "abc"

数组声明方式:
Go的数组声明必须要指定数组的长度及数组内每个元素的类型。

var arr [4]string
arr[0] = "a"
arr[1] = "b"
arr[2] = "c"
arr[3] = "4"

5. 类型的检查
编译器能够帮忙检查数据类型,使用reflect包能更细致地检查变量类型。

package main

import (
"fmt"
"reflect"
)


func main() {
var s string = "aabb"
var a_int int = 2
var a_float float64 = 32.6
fmt.Println(reflect.TypeOf(s),reflect.TypeOf(a_int),reflect.TypeOf(a_float))
}

检查结果:

GO语言的数据类型_go语言_02


在编码过程中,如果我们需要对数据的类型进行判断,然后再进行相应的操作,或者调试过程中检查代码逻辑的正确性,reflect包都能够帮助到我们。

fmt和reflect包都是go自带的,在%GOPATH%\go\src中都可查。

6. 类型的转换
类型转换是由strconv包提供的,用于字符串与其他类型之间进行相互的转换。下面举一个布尔型与字符串之间相互转换的例子:

package main

import (
"fmt"
"reflect"
"strconv"
)


func main() {
var s string = "true"
s_bool,err := strconv.ParseBool(s)
s_s := strconv.FormatBool(s_bool)
fmt.Println(s,s_bool,s_s,err)
fmt.Println(reflect.TypeOf(s),reflect.TypeOf(s_bool),reflect.TypeOf(s_s))
}

我们定义一个字符串s,其值为"true",然后调用strconv包中的ParseBool函数将其转换为布尔型,再调用FormatBool将布尔型重新转换为字符串型,并分别输出其值,以及这三个值的类型。运行结果如下:

GO语言的数据类型_数据库_03

到此,我们已经了解了基本的一些数据类型,更加复杂的用法我们将在后面的文章里继续探讨,本节到此为止。


举报

相关推荐

0 条评论