Go Web编程实战(3)----数据类型(一)

简介: Go Web编程实战(3)----数据类型(一)

前言


Go语言数据类型包括布尔型、数字类型、字符串类型、复合类型这4种。其中复合类型又分为:数组类型、切片类型、Map类型以及结构体类型。


布尔型

与其他编程语言一样,Go语言的布尔型只可以是true或者false。


下面,我们来举例说明使用方式:

var x int=100
fmt.Println(x==100)
fmt.Println(x!=100)


需要特别注意的是,Go语言对于值之间的比较有非常严格的限制,只有2相同类型的值才可以进行比较。如果值是接口,则它们必须实现相同的接口。如果其中一个值是常量,则另外一个值可以不是常量,但是类型和该常量必须相同。如果以上条件都不满足,则必须将其中一个值的类型转换为和另一个值相同的类型,才可以进行比较。


在Go语言中,and是 &&;or 是 ||。布尔值也不会被显式的转换为0或1,也不能被强制转换成整型。如果你想把布尔型转换为数字0或1,需要这样写:

func main() {
  var x int=100
  fmt.Println(boolToInt(x==100))
  fmt.Println(boolToInt(x!=100))
}
func boolToInt(b bool) int{
  if b{
  return 1
  }
  return 0
}


数字类型

Go语言支持非常多的数字类型,为了让大家更加明了,博主专门列出了一张表格供大家参考。

类型 描述 范围
uint8 无符号8位整型 0~255
uint16 无符号16位整型 0~65535
uint32 无符号32位整型 0~4294967295
uint64 无符号64位整型 0~18446744073709551615
int8 有符号8位整型 -128~127
int16 有符号16位整型 -32768~32767
int32 有符号32位整型 -2147483648~2147483647
int64 有符号64位整型 -9223372036854775808~9223372036854775807
float32 IEEE-754 32位浮点数
float64 IEEE-754 64位浮点数
complex32 32位实数和虚数
complex64 64位实数和虚数
byte 和uint8等价
rune 和int32等价
unit 32位或64位无符号整型
int 32位或64位有符号整型
uintptr 无符号整型,用于存放一个指针

需要注意的是,在32位操作系统上,int和uint均使用32位(4个字节);在64位操作系统上,它们均使用64位(8个字节)。


字符串类型

在Go语言中,字符串是由单个字节连接起来的,字节使用的是UTF-8编码来表示Unicode文本。由于该编码占用字节长度的不确定性,字符串也会根据需要占用1~4byte。


Go语言这样做,不仅减少了内存和硬盘空间的占用,而且也不用像其他语言那样需要对使用UTF-8字符集的文本进行编码和解码。


下面,我们先来看一段代码:

str1 :="\"liyuanjing\"" +
  "str1"
str2 :="liyuanjing\n"
fmt.Print(str2)
fmt.Print(str1)


如果大家运行上面这段代码,就会发现str2输出完成之后也会换行,要知道我们这里用的Print,并不是Println。所以,可以得出结论,Go语言字符串支持“\”转义,但转义字符会按意义默认输出。同时,字符串也支持换行链接。


另外,Go语言的字符串,你可以默认看作一个数组,它可以通过“[]”写入索引来获取单个的字符。下面,我们来举一个例子。

str1 :="liyuanjing"
//获取字符串索引1(位置2)的字符ASCII编码
fmt.Println(str1[1])
//获取字符串索引1(位置2)的字符
fmt.Println(string(str1[1]))
//获取字符串索引0到2的字符(不包括2)
fmt.Println(str1[0:2])
//获取字符串索引6开始的所有的字符
fmt.Println(str1[6:])
//获取字符串索引0到2的字符(不包括2)
fmt.Println(str1[:2])
//获取字符串长度
fmt.Println(len(str1))
//获取字符串所有字符的ASCII编码
fmt.Println([]rune(str1))
//获取字符串字符个数(长度)
fmt.Println(utf8.RuneCountInString(str1))


运行之后,输出控制台类型如下:


需要注意的是,在Go语言中,不能直接修改字符串,也就是不能通过str[1]的方式进行替换修改。如果你要修改,需要将字符串复制到一个可写的变量中,一般是[]byte或[]rune,然后在进行修改。


使用[]byte修改

对于修改字符串的单个字符,可以直接通过[]byte进行修改。示例如下:

str :="liyuanjing"
//复制
copyStr :=[]byte(str)
//修改字符
copyStr[2]='Y'
fmt.Printf("%s\n",str)
fmt.Printf("%s\n",copyStr)


需要注意的是,单个字符用’ '单引号。运行之后,输出如下:


使用[]rune修改

话不多说,这里直接上代码。

str :="liyuanjing"
//复制
copyStr :=[]rune(str)
//修改字符
copyStr[2]='Y'
fmt.Println(str)
fmt.Println(string(copyStr))


运行之后的效果,如前文所示。


指针类型

学过C语言的应该很容易理解指针,它就是变量存储的一个内存地址的变量类型。比如,大家可以把内存想象成一个顺序存储的方格(只是比喻)。


假如定义的a变量存储6这个数,那么a肯定也在方格中,那么我们可以这样定义指针指向a的内存地址。

var a int=6
var b *int=&a


指针的简单用法

下面,我们来使用指针类型。在Go语言中,可以使用“%p”,输出变量取地址后的指针值。


示例如下:

var a int=6
var b *int=&a
fmt.Printf("%p\n",&a)
fmt.Printf("%p",b)


运行之后,我们会发现这2个值是相等的,这是因为b存储的本身就是指针值(地址),而通过&a取的也是a的地址,并不是值。如果你再输入&b,意味着是指针的指针,也就是b的地址。(有点绕)


修改指针值

在每次学习心的编程语言时,读者肯定都接触过用一个临时变量,交换2个变量的值。而修改指针同样也需要这么操作。

func main() {
  a, b := 5, 8
  exchange(&a, &b)
  fmt.Println(a, b)
}
func exchange(c, d *int) {
  t := *c
  *c = *d
  *d = t
}


其实这跟Java与C中的方法,是参数还是参数的引用是一样的。如果不是指针,只是值,这么做并不能改变原始参数的值。

相关文章
|
5天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
31 3
|
1天前
|
缓存 监控 安全
Django框架在大型Web应用中的架构设计与实战
【5月更文挑战第18天】Django框架在构建大型Web应用中扮演重要角色,采用分层架构(数据、业务逻辑、表示层)和多应用组织模式,结合缓存策略(如Memcached、Redis)提升性能。通过异步处理、分布式部署提高响应速度和扩展性。关注数据分区、安全设计及监控日志,确保系统高效、稳定。Django为复杂业务提供坚实基础,助力打造卓越Web系统。
18 7
|
2天前
|
JSON JavaScript 前端开发
web前端入门到实战:32道常见的js面试题,2024年最新秋招是直接面试吗
web前端入门到实战:32道常见的js面试题,2024年最新秋招是直接面试吗
|
2天前
|
JavaScript 前端开发 程序员
web前端入门到实战:32道常见的js面试题(1),面试哪些
web前端入门到实战:32道常见的js面试题(1),面试哪些
|
4天前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
5天前
|
存储 人工智能 测试技术
python自动化测试实战 —— CSDN的Web页面自动化测试
python自动化测试实战 —— CSDN的Web页面自动化测试
194 0
|
5天前
|
监控 安全 Shell
记一次应急靶场实战--web1
本次应急靶机题目训练主要是为了应对接下来的护网面试和比赛,顺便提高一下自己对应急和溯源的实战能力,这里有两个逗比的事情发生,一是用D盾分析的时候,电脑环境监测到了,把要分析的马杀了,二是,发现无法使用脚本,在自己本机实验,电脑差点搞崩,还好佬在制作时候只是单次运行会占用.切记不要本机实验,一定要在虚拟机中进行测试.
|
5天前
|
JavaScript 前端开发 开发者
【Web 前端】TypeScript 的内置数据类型有哪些?
【5月更文挑战第1天】【Web 前端】TypeScript 的内置数据类型有哪些?
|
5天前
|
JSON 监控 安全
Golang深入浅出之-Go语言中的反射(reflect):原理与实战应用
【5月更文挑战第1天】Go语言的反射允许运行时检查和修改结构,主要通过`reflect`包的`Type`和`Value`实现。然而,滥用反射可能导致代码复杂和性能下降。要安全使用,应注意避免过度使用,始终进行类型检查,并尊重封装。反射的应用包括动态接口实现、JSON序列化和元编程。理解反射原理并谨慎使用是关键,应尽量保持代码静态类型。
25 2
|
5天前
|
缓存 监控 测试技术
【Go语言专栏】使用Go语言构建高性能Web服务
【4月更文挑战第30天】本文探讨了使用Go语言构建高性能Web服务的策略,包括Go语言在并发处理和内存管理上的优势、基本原则(如保持简单、缓存和并发控制)、标准库与第三方框架的选择、编写高效的HTTP处理器、数据库优化以及性能测试和监控。通过遵循最佳实践,开发者可以充分利用Go语言的特性,构建出高性能的Web服务。