Golang 【basic_leaming】基本数据类型

news2024/11/26 10:38:53

阅读目录

  • Golang 数据类型介绍
    • 整型
      • 特殊整型
      • unsafe.Sizeof 查看内存所占用大小
      • int 不同长度直接的转换
      • 数字字面量语法(Number literals syntax)(了解)
    • 浮点型
    • 布尔值
    • 字符串
      • 字符串转义符
      • 多行字符串
      • 字符串的常用操作
    • 修改字符串
    • byte 和 rune 类型

Golang 数据类型介绍

Go 语言中数据类型分为:基本数据类型和复合数据类型。

基本数据类型有:
整型、浮点型、布尔型、字符串。

复合数据类型有:
数组、切片、结构体、函数、map、通道(channel)、接口等。

整型

整型分为以下两个大类:

  • 有符号整形按长度分为:int8、int16、int32、int64
  • 对应的无符号整型:uint8、uint16、uint32、uint64

在这里插入图片描述
关于字节:字节也叫 Byte,是计算机数据的基本存储单位。

  • 8bit(位)=1Byte(字节) 1024Byte(字节)=1KB
  • 1024KB=1MB
  • 1024MB=1GB
  • 1024GB=1TB

在电脑里一个中文字是占两个字节的。
一个汉字 = 2字节,
中文标点占三个字节,
一个英文字母占一个字节,
英文标点占一个字节。

1字节(Byte)=8字位=8个二进制数。

特殊整型

在这里插入图片描述

注意: 在使用 int 和 uint 类型时,不能假定它是32 位或64 位的整型,而是考虑 int 和 uint 可能在不同平台上的差异。

注意事项:实际项目中整数类型、切片、map 的元素数量等都可以用 int 来表示。在涉及到二进制传输、为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用 int 和 uint。

package main

import (
	"fmt"
)

func main() {
	var num int64
	num = 123
	fmt.Printf("值:%v 类型%T", num, num)
	// 值:123 类型int64
}

unsafe.Sizeof 查看内存所占用大小

unsafe.Sizeof(n1) 是 unsafe 包的一个函数,可以返回 n1 变量占用的字节数。

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	var a int8 = 120
	fmt.Printf("%T\n", a)
	fmt.Println(unsafe.Sizeof(a))
	/*
		running...
		int8
		1
	*/
}

int 不同长度直接的转换

package main
import (
	"fmt"
)
func main() {
	var num1 int8
	num1 = 127
	num2 := int32(num1)
	//值:127 类型int32
	fmt.Printf("值:%v 类型%T", num2, num2) 
}

数字字面量语法(Number literals syntax)(了解)

Go1.13 版本之后引入了数字字面量语法,这样便于开发者以二进制、八进制或十六进制浮点数的格式定义数字,例如:

v := 0b00101101, 代表二进制的 101101,相当于十进制的 45。v := 0o377,代表八进制的 377,相当于十进制的 255。v := 0x1p-2,代表十六进制的 1 除以 ,也就是0.25。而且还允许我们用 _ 来分隔数字,比如说:

v := 123_456 等于123456。

我们可以借助 fmt 函数来将一个整数以不同进制形式展示。

package main

import "fmt"

func main() {
	// 十进制
	var a int
	a = 10
	fmt.Printf("%d \n", a) // 10
	fmt.Printf("%b \n", a) // 1010 占位符%b 表示二进制
	// 八进制以0 开头
	var b int
	b = 077
	fmt.Printf("%o \n", b) // 77
	// 十六进制以0x 开头
	var c int
	c = 0xff
	fmt.Printf("%x \n", c) // ff
	fmt.Printf("%X \n", c) // FF
	fmt.Printf("%d \n", c) // 255
}

浮点型

Go 语言支持两种浮点型数:float32float64。这两种浮点型数据格式遵循 IEEE 754 标准:

float32 的浮点数的最大范围约为3.4e38,可以使用常量定义:math.MaxFloat32

float64 的 浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64

打印浮点数时,可以使用 fmt 包配合动词 %f,代码如下:

package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Printf("%f\n", math.Pi)   //默认保留6 位小数
	fmt.Printf("%.2f\n", math.Pi) //保留2 位小数
}

Go 语言中浮点数默认是 float64。

num := 1.1
//值:1.1--类型:float64
fmt.Printf("值:%v--类型:%T", num, num)

Golang 中 float 精度丢失问题。

几乎所有的编程语言都有精度丢失这个问题,这是典型的二进制浮点数精度损失问题,在定长条件下,二进制小数和十进制小数互转可能有精度丢失。

d := 1129.6
fmt.Println((d * 100)) //输出:112959.99999999999
var d float64 = 1129.6
fmt.Println((d * 100)) //输出:112959.99999999999
m1 := 8.2
m2 := 3.8

// 期望是4.4,结果打印出了4.399999999999999
fmt.Println(m1 - m2) 

使用第三方包来解决精度损失问题:https://github.com/shopspring/decimal

Golang 科学计数法表示浮点类型

num8 := 5.1234e2 // ? 5.1234 * 10 的2 次方

// ? 5.1234 * 10 的2 次方shift+alt+向下的箭头
num9 := 5.1234E2 

// ? 5.1234 / 10 的2 次方0.051234
num10 := 5.1234E-2 
fmt.Println("num8=", num8, "num9=", num9, "num10=", num10)

布尔值

Go 语言中以 bool 类型进行声明布尔型数据,布尔型数据只有 true(真)和 false(假)两个值。

注意:

1、 布尔类型变量的默认值为false。
2、Go 语言中不允许将整型强制转换为布尔型.
3、布尔型无法参与数值运算,也无法与其他类型进行转换。

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	var b = true
	fmt.Println(b, "占用字节:", unsafe.Sizeof(b))
	// true 占用字节: 1
}

字符串

Go 语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。

Go 语言里的字符串的内部实现使用UTF-8 编码。

字符串的值为双引号 (") 中的内容,可以在Go 语言的源码中直接添加非ASCII 码字符,例如:

s1 := "hello"
s2 := "你好"

字符串转义符

Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示。

在这里插入图片描述
举个例子,我们要打印一个Windows 平台下的一个文件路径:

package main

import (
	"fmt"
)

func main() {
	fmt.Println("str := \"c:\\Code\\demo\\go.exe\"")
	//str := "c:\Code\demo\go.exe"
}

多行字符串

Go 语言中要定义一个多行字符串时,就必须使用反引号字符:

s1 := `第一行
第二行
第三行`
fmt.Println(s1) 

反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。

字符串的常用操作

在这里插入图片描述

len(str)求字符串的长度。

var str = "this is str"
fmt.Println(len(str))

拼接字符串。

var str1 = "你好"
var str2 = "golang"
fmt.Println(str1 + str2)

var str3 = fmt.Sprintf("%v %v", str1, str2)
fmt.Println(str3)

strings.Split 分割字符串。

var str = "123-456-789"
var arr = strings.Split(str, "-")
fmt.Println(arr)

拼接字符串,

var str = "this is golang"
var flag = strings.Contains(str, "golang")
fmt.Println(flag)

判断首字符尾字母是否包含指定字符。

var str = "this is golang"
var flag = strings.HasPrefix(str, "this")
fmt.Println(flag)

var str = "this is golang"
var flag = strings.HasSuffix(str, "go")
fmt.Println(flag)

判断字符串出现的位置。

var str = "this is golang"
var index = strings.Index(str, "is") //从前往后
fmt.Println(index)

var str = "this is golang"
var index = strings.LastIndex(str, "is") //从后网前
fmt.Println(index)

Join 拼接字符串。

var str = "123-456-789"
var arr = strings.Split(str, "-")
var str2 = strings.Join(arr, "*")
fmt.Println(str2)

修改字符串

要修改字符串,需要先将其转换成[]rune 或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。

// 遍历字符串
package main

import "fmt"

func changeString() {
	s1 := "big"
	// 强制类型转换
	byteS1 := []byte(s1)
	byteS1[0] = 'p'
	fmt.Println(string(byteS1))
	s2 := "白萝卜"
	runeS2 := []rune(s2)
	runeS2[0] = '红'
	fmt.Println(string(runeS2))
}

func main() {
	changeString()
	// pig
	// 红萝卜
}

byte 和 rune 类型

组成每个字符串的元素叫做“字符”,可以通过遍历字符串元素获得字符。字符用单引号 (’) 包裹起来,如:

package main

import "fmt"

func main() {
	a := 'a'
	b := '0'
	//当我们直接输出byte(字符)的时候输出的是这个字符对应的码值
	fmt.Println(a)
	fmt.Println(b)
	//如果我们要输出这个字符,需要格式化输出
	fmt.Printf("%c--%c", a, b) 
	//%c 相应Unicode 码点所表示的字符
}

字节(byte):是计算机中数据处理的基本单位,习惯上用大写 B 来表示,1B(byte,字节)= 8bit(位)字符:是指计算机中使用的字母、数字、字和符号一个汉子占用3 个字节一个字母占用一个字节。

a := "m"
fmt.Println(len(a)) //1

b := "张"
fmt.Println(len(b)) //3

Go 语言的字符有以下两种:

1、uint8 类型,或者叫 byte 型,代表了ASCII 码的一个字符。
2、rune 类型,代表一个UTF-8 字符。

当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型实际是一个 int32。

Go 使用了特殊的 rune 类型来处理Unicode,让基于 Unicode 的文本处理更为方便,也可以使用 byte 型进行默认字符串处理,性能和扩展性都有照顾。

// 遍历字符串
package main

import "fmt"

func main() {
	s := "hello 张三"
	for i := 0; i < len(s); i++ {
		//byte
		fmt.Printf("%v(%c) ", s[i], s[i])
	}
	fmt.Println()
	for _, r := range s {
		//rune
		fmt.Printf("%v(%c) ", r, r)
	}
	fmt.Println()
}

在这里插入图片描述
因为UTF8 编码下一个中文汉字由3 个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出中第一行的结果。

字符串底层是一个byte 数组,所以可以和[ ]byte 类型相互转换。字符串是不能修改的字符串是由 byte 字节组成,所以字符串的长度是 byte 字节的长度。

rune 类型用来表示utf8 字符,一个rune 字符由一个或多个byte 组成。

rune 类型实际是一个int32

c3 := "营"
c4 := '营'
fmt.Printf("C3 的类型%T--C4 的类型%T", c3, c4) 
//C3 的类型string--C4 的类型int32

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PYNQ -z2 与 PC主板网口直连

文章目录1.下载映像文件并烧录到板子2. 将usb和网线连接到电脑上3. 使用xshell新建串口通信连接到板子4. 查看板子ip ifconfig命令5. 将pc的网络改成与板子同一个网段6. 通过ip地址访问1.下载映像文件并烧录到板子 可以参考 烧录镜像 2. 将usb和网线连接到电脑上 3. 使用xshe…

jsp+ssm计算机毕业设计毕业论文管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

【函数】你上街买菜用的着函数吗?

前言 函数是什么 每个C程序都至少有一个函数&#xff0c;即main主函数 &#xff0c;如果程序的任务比较简单&#xff0c;全部的代码都写在main函数中&#xff0c;但是在实际开发中&#xff0c;程序的任务往往比较复杂&#xff0c;如果全部的代码都写在main函数中&#xff0c;…

Nginx配置整合:基本概念、命令、反向代理、负载均衡、动静分离、高可用

一、基本概念 1.什么是Nginx Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理server。其特点是占有内存少。并发能力强&#xff0c;其并发能力确实在同类型的网页server中表现较好。 http服务器 Web服务器是指驻留于因特网上某种类型计算机的程…

热门的Java开源项目

1 JCSprout https://github.com/crossoverJie/JCSprout Star 17084 这是一个还处于萌芽阶段的 Java 核心知识库。分为常用集合、Java多线程、JVM、分布式相关、常用框架等内容 2 arthas https://github.com/alibaba/arthas Star 6836 Arthas旨在帮助开发人员解决Java应用程…

高级网络应用复习——三层交换DHCP中继(带命令)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.知识点总结 二.DHCP中继实验 实验要求 实验命令 三层交换…

腾讯会议人数上限进不去?

很多用户都在使用腾讯会议来进行线上会议&#xff0c;因此经常会出现人数到达上限进不去的情况&#xff0c;非常令人头疼&#xff0c;那这时候要怎么办呢&#xff1f;下面就来看看解决办法。 腾讯会议人数上限进不去怎么办&#xff1f; 答&#xff1a;只能等待有人退出后再加入…

数据结构入门-单调队列

数据结构入门-单调队列 原理介绍 双向队列 思考一下&#xff1a;对于数组nums&#xff0c;我们想知道max(nums[i-k],...,nums[i])如何高效处理&#xff1f; 单调队列 单调队列&#xff0c;即从队首到队尾单调的队列。 #mermaid-svg-6PhVAHBib6ohdcIC {font-family:"tre…

从mask rcnn到mask scoring rcnn

mrcnn (mask rcnn) 不足:框架没有解决实例分割评分 对mask head输出的K(类别)个mask,选择哪个mask作为最终的输出,取决于分类支路置信度最高的类别。也就是用分类置信度来衡量mask质量,这会导致下图的现象: 左侧四幅图像显示出良好的检测结果,具有高分类分数但掩模质…

【spring系列】SPI详解

1.什么是SPI SPI全称Service Provider Interface&#xff0c;是Java提供的一套用来被第三方实现或者扩展的接口&#xff0c;它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。2.SPI和API的使用场景 API &#xff08;Application Programming …

大数据Kudu(七):Kudu分区策略

文章目录 Kudu分区策略 一、​​​​​​​Partition By Range - 范围分区

最通俗易懂的 JAVA slf4j,log4j,log4j2,logback 关系与区别以及完整集成案例

最近在工作中&#xff0c;发现接触到的很多小伙伴分不清楚logback slf4j 以及log4j 的关系&#xff0c;有的人认为是一个东西&#xff0c;有的人认为是完全没关系&#xff0c;或者说有关系但是不清楚具体是什么区别和联系&#xff0c;今天咱们就简单梳理下他们之间的联系和区别…

项目式学习法(PBL)如何让你快速成为行业专家【一杯咖啡谈项目】

项目人人都是主角&#xff0c;没有旁观者。我们每个人也应当好PM&#xff0c;这就离不开学习提升自己&#xff0c;&#xff0c;如此&#xff0c;方能更好推动经济社会高质量发展。 1、项目式学习是什么&#xff1f; 关于项目式学习&#xff0c;目前国内外还没有个统一的定义&…

【python】 json字符串转对象

目录 一&#xff1a;json对象转换为json字符串 二&#xff1a;json字符串转换为json对象 三&#xff1a;json字符串{"name":"lily","sno":1001} 四&#xff1a;python面向对象程序设计 一&#xff1a;json对象转换为json字符串 import json…

Elasticsearch 安装及启动【Linux】

一、下载安装包 1.下载 Elasticsearch 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases#elasticsearch 2.下载 Kibana Kibana 数据可视化平台可以选择性安装 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases#kiban…

连续仨月霸占牛客榜首京东T8呕心巨作:700页JVM虚拟机实战手册

什么是Java虚拟机&#xff1f; 虚拟机是一种抽象化的计算机&#xff0c;通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构&#xff0c;如处理器、堆栈、寄存器等&#xff0c;还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息…

怎么防止同事用Evil.js的代码投毒

最近Evil.js被讨论的很多&#xff0c;项目介绍如下 项目被发布到npm上后&#xff0c;引起了激烈的讨论&#xff0c;最终因为安全问题被npm官方移除&#xff0c;代码也闭源了 作为一个前端老司机&#xff0c;我肯定是反对这种行为&#xff0c;泄私愤有很多种方式&#xff0c;代…

深度学习——多GPU训练代码实现

1.数据并行性。 一台机器有K个GPU&#xff0c;给定训练模型&#xff0c;每个GPU参数值是相同且同步&#xff0c;每个GPU独立地维护一组完整地模型参数。k2时数据并行地训练模型&#xff0c;利用两个GPU上的数据&#xff0c;并行计算小批量随机梯度下降。 K个GPU并行训练过程&a…

【Spring Cloud】Eureka注册中心从原理到实战图文详细教程

本期目录1. Eureka介绍1.1 Eureka能解决的问题2. Eureka原理3. 搭建Eureka Server3.1 引入依赖3.2 编写启动类3.3 修改配置文件3.4 启动Eureka微服务4. 服务注册4.1 导入依赖4.2 修改配置文件4.3 重启微服务4.4 启动多个微服务实例5. 服务发现5.1 修改业务层代码5.2 在RestTemp…

A_A05_002 sscom33串口调试助手使用

目录 一、软件获取 二、软件基本功能介绍 1、接收区 2、串口通信参数配置区 3、串口打开关闭与其他设置区域 4、手动发送区域 5、多文本发送区 6、辅助区域 三、注意事项 一、软件获取 网盘链接 直戳跳转 二、软件基本功能介绍 1、接收区 接收区就是接收外部设备给串口…