Go基础之数据类型 | 青训营

Go语言数据类型

Go语言的数据类型十分丰富,常见的包括整型、浮点型、字符串和布尔型等。Go语言特有的数据类型包括接口和通道等。

整型

整型主要分为有符号整型和无符号整型两大类:
1.有符号整型:int8、int16、int32、int64。
2.无符号整型:uint8、uint16、uint32、uint64。
有符号整型其二进制最高位储存符号,因此两者的区别就是无符号整型可以存放的正数范围比有符号整型中的正数范围大一倍。
例如:int16的范围为-32768(即−215-2^{15}215)到32767(即215−12^{15}-12151),uint16的范围为0到65535(即2162^{16}216-1)。

package main
import "fmt"

func mian(){
    a := 3
    b := 2
    fmt.Println(a/b)
}

执行结果

1

注意:在Go语言中,对于两个整型变量的除法运算,小数部分将会直接被截取,只取整数部分,不会存在四舍五入的情况。

浮点型

编程语言中的浮点数就是我们常说的小数。
Go语言支持两种浮点数:float32和float64。float32浮点数的最大范围约为3.4e38,float64浮点数最大范围约为1.8e308。

package main
import (
    "fmt"
    "reflflect"
)
func main() {
    a := 3.0
    b := 2.0
    fmt.Println(a/b)
    fmt.Println("变量a的类型为:",reflflect.TypeOf(a))
    fmt.Println("变量b的类型为:",reflflect.TypeOf(b))
}

执行结果:

1.5
变量a的类型为:flfloat64
变量b的类型为:flfloat64

此处,我们调用reflect.TypeOf()函数来打印变量a和b的类型。

字符串

Go语言中,字符串的值为双引号中的内容,而且可以直接输入中文。

package main
import "fmt"

func main()
{
    str := "你好,世界"
    fmt.Println(str)
}

执行结果:

你好,世界

实际编程中,我们会遇到输入多行字符串的情况,此时需要使用'`'字符,即反引号。

package main
import "fmt"

func main()
{
    str := `第一行
第二行
第三行
`
    fmt.Println(str)
}

执行结果:

第一行
第二行
第三行

字符和转义字符

1.转义字符

字符串中的每个元素就是字符。
Go语言中,字符的值为单引号中的内容,而且可以直接输入中文。
Go语言的字符有以下两种类型:
◇ uint8类型:代表了ASCII码的一个字符。
◇ rune类型:代表了UTF格式的一个字符(如中文、日文或其他复合字符),本质是int32 类型。

package main
import "fmt"

func main(){
    asc = 'a'
    ch = '我'
    fmt.Println(asc)
    fmt.Println(ch)
}

执行结果:

97
25105

第一行打印了字符'a'的ASCII码值97,第二行打印了中文字符'我'的int32类型值25105。

2.转义字符

通常我们使用反斜线“\”来对字符进行转义,转义字符具有特定的含义,不同于字符原有的意义,所以称为转义字符。
常见转义符

转义符含义
\n匹配换行符
\r匹配回车符
\t匹配制表符
\'匹配单引号
\""匹配双引号
\\匹配反斜杠

布尔类型

布尔型是最简单的数据类型,只有两个值:false(假)和true(真)。

package main
import "fmt"

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

执行结果:

false
true

数据类型判断

如果我们需要判断变量的类型,可以使用Go语言标准库中的reflect包,通过将变量传入此包的TypeOf()方法,得到变量的数据类型。

package main
import (
    "fmt"
    "reflect"
)

func main(){
    a := 1
    b := "tst"
    c := true
    fmt.Println(reflect.TypeOf(a))
    fmt.Println(reflect.TypeOf(b))
    fmt.Println(reflect.TypeOf(c))
}

执行结果:

int
string
bool

TypeOf()方法直接返回传入变量的类型,通过Println()方法打印到控制台。

数据类型转换

Go语言常见的数据类型之间能够互相进行类型转换,通过使用类型前置加小括号的方式进行。

package main
import (
    "fmt"
    "reflect"
)

func main(){
    var a int16 = 97
    fmt.Println("变量a值为:",a,",变量类型为:",reflect.TypeOf(a))
    b := int32(a)
    fmt.Println("变量b值为:",b,",变量类型为:",reflect.TypeOf(b))
    fmt.Println("转换变量b类型为string:",string(b))
}

执行结果:

变量a值为: 97 ,变量类型为: int16
变量b值为: 97 ,变量类型为: int32
转换变量b类型为string: a

在转换变量类型时,我们需要注意变量原本的值是否会发生改变。

package main
import (
    "fmt"
    "reflect"
)
 
func main() {
    var a int32 = 1234567891
    fmt.Println("变量a值为:",a,",变量类型为:",reflect.TypeOf(a))
    fmt.Println("转换变量a类型为int16,变量a值变为:",int16(a),", 变量a类型变为:",reflect.TypeOf(int16(a)))
}

执行结果:

变量a值为:1234567891, 变量类型为:int32
转换变量a类型为int16,变量a值变为:723, 变量a类型变为:int16

由于16位有符号整型的范围为-32768~32767,而变量a的值1234567891不在这个范围内,导致变量a原本的值发生改变。
1234567891对应的十六进制为0x499602d3,转变为16位变量后,长度缩短一半,丢失了前(高)4位十六进制,即变为:0x02d3,其对应的十进制值为723。

小结

◇ 整型主要分为有符号整型无符号整型两大类。
◇ Go语言常见的数据类型之间能够互相进行类型转换,通过使用类型前置加小括号的方式进行。

全部评论

相关推荐

头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器->这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题->后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
野猪不是猪🐗:还是太卑微了,什么叫放弃本次面试应该说经过评估,贵公司与自己不匹配,决定不再推进后续流程
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务