GO语言-数据类型
文章目录
- 变量定义
- 1. 整数类型
- 2. 浮点类型
- 3. 字符类型
- 4. 布尔类型
- 5. 字符串类型
- 5.1 字符串的本质
- 5.2 常用字符串处理函数(strings包)
- 5.3 修改字符串的方式
- 6. 数据默认值
- 7. 类型转换
变量定义
代码如下:
package mainimport "fmt"var i1 = 1000
var i2 intvar(i5 = "hello"i6 = "world"
)func main(){var i intfmt.Println("i = ", i)i = 10fmt.Println("i = ", i)var num = 10.01 fmt.Println("num = ", num)num = 100.01 fmt.Println("num = ", num)Name := "MikeSun"fmt.Println("Name = ", Name)var n1 , n2 , n3 intfmt.Println("n1 = ", n1, "n2 = ", n2, "n3 = ", n3)var n4 , name1 , n5 = 100, "MikeSun", 200fmt.Println("n4 = ", n4, "name1 = ", name1, "n5 = ", n5)n6, name2, n7 := 1000, "joke", 2000fmt.Println("n6 = ", n6, "name2 = ", name2, "n7 = ", n7)fmt.Println("i1 = ", i1, "i2 = ", i2)fmt.Println("i5、i6 = ", i5, i6)
}
1、从main函数上面的全局变量开始分析:
全局变量定义,定义时不声明类型,只定义数值,自动分配类型:
var i1 = 1000
全局变量定义:
var i2 int
全局变量定义,同时定义多个对象:
var(
i5 = “hello”
i6 = “world”
)
2、再来看main函数中的变量定义方式
定义变量不赋值:
var i int
3、对已定义的变量赋值:
i = 10
4、定义变量,不声明类型,默认匹配类型:
var num = 10.01
5、定义并且赋值:
Name := “MikeSun”
上面代码等价于
var Name string
Name = “MikeSun”
6、一次定义多个变量
var n1 , n2 , n3 int
7、一次性定义多个变量并且赋值
var n4 , name1 , n5 = 100, “MikeSun”, 200
8、一次性定义多个变量并且赋值
n6, name2, n7 := 1000, “joke”, 2000
1. 整数类型
| 类型 | 位数 | 取值范围 | 说明 |
|---|---|---|---|
| int | 32/64 | -2³¹ 到 2³¹-1(32位)或 -2⁶³ 到 2⁶³-1(64位) | 平台相关,32位或64位取决于系统 |
| int8 | 8 | -128 到 127 | 8位有符号整数 |
| int16 | 16 | -32,768 到 32,767 | 16位有符号整数 |
| int32 | 32 | -2,147,483,648 到 2,147,483,647 | 32位有符号整数(同 rune) |
| int64 | 64 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 32位有符号整数 |
| int | 32/64 | 0 到 2³²-1(32位)或 0 到 2⁶⁴-1(64位) | 平台相关,32位或64位取决于系统 |
| uint8 | 8 | -128 到 127 | 8位无符号整数(同byte) |
| uint16 | 16 | -32,768 到 32,767 | 16位无符号整数 |
| uint32 | 32 | -2,147,483,648 到 2,147,483,647 | 32位无符号整数 |
| uint64 | 64 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 32位无符号整数 |
| byte | 8 | -128 到 127 | uint8 的别名,用于字节数据 |
| rune | 32 | -2,147,483,648 到 2,147,483,647 | int32 的别名,表示 Unicode 码点 |
2. 浮点类型
| 类型 | 位数 | 取值范围(近似) | 精度 | 说明 |
|---|---|---|---|---|
| float32 | 32 | ±1.18e⁻³⁸ 到 ±3.4e³⁸ | 6-7位小数 | 单精度浮点数,占用4字节 |
| float64 | 64 | ±2.23e⁻³⁰⁸ 到 ±1.8e³⁰⁸ | 15-16位小数 | 双精度浮点数,占用8字节 |
| 代码示例如下: | ||||
| 下面代码有介绍科学计数法、省略整数部分写法。 |
package main
import ("fmt""reflect"
)func main(){var price float32 = 89.12fmt.Println("price = ", price)var num1 float32 = -0.00089var num2 float64 = -7809656.09fmt.Println("num1 = ", num1, "num2 = ", num2)//尾部部分精度丢失,造成精度损失var num3 float32 = -123.0000901var num4 float64 = -123.0000901fmt.Println("num3 = ", num3, "num4 = ", num4)//Golang的浮点类型默认声明为float64 类型var num5 = 1.1fmt.Println("typeof num5 is ", reflect.TypeOf(num5))//十进制数形式:如:5.12 .512(必须有小数点)num6 := 5.12num7 := .123fmt.Println("num6 = ", num6, "num7 = ", num7)//科学计数法num8 := 5.1234e2num9 := 5.1234E2num10 := 5.1234E-2fmt.Println("num8 = ", num8, "num9 = ", num9, "num10 = ", num10)
}
3. 字符类型
Go语言统一使用Unicode编码。
字符类型的本质就是一个整数型,一个整数对应Unicode中的一个字符,从而可以使用特地的输出格式输出,如%c。
Unicode编码是包含ASCII码的,所以前面的256个字符仍然可以当作ASCII码来输出或转换。
package mainimport ("fmt"
)func main(){var c1 byte = 'a'var c2 byte = '0'fmt.Println("c1 = ", c1)fmt.Println("c2 = ", c2)// 要输出ASCII值必须要格式化输出fmt.Printf("c1 = %c c2 = %c", c1, c2)var c3 int = '孙'fmt.Printf("c3 = %c c3 = %d", c3, c3)var c4 int = 22269fmt.Printf("\nc4 = %c", c4)var c5 int = 65fmt.Printf("\nc5 = %c", c5)
}运行结果:
c1 = 97
c2 = 48
c1 = a c2 = 0c3 = 孙 c3 = 23385
c4 = 国
c5 = A
4. 布尔类型
代码示例如下:
package main
import ("fmt""unsafe"
)func main(){var bflag = falsefmt.Println("bflag = ", bflag)//注意事项//1.bool类型占用存储空间是1个字节fmt.Println("bflag 的占用空间 = ", unsafe.Sizeof(bflag))//2.bool类型只能取true或者false
}运行结果:
bflag = false
bflag 的占用空间 = 1
注意:
1、bool类型不能参加±运算,可以参加逻辑运算。
| 运算符 | 说明 | 示例 |
|---|---|---|
| && | 逻辑与(AND) | true && false → false |
| || | 逻辑或(OR) | true |
| ! | 逻辑非(NOT) | !true → false |
| 错误示例: |
b := true
// fmt.Println(b + 1) // 错误:bool 不能参与数学运算
2、Go 是强类型语言,其他类型不能隐式转为 bool
// 错误示例
i := 1
if i { // 编译错误:non-bool i (type int) used as if conditionfmt.Println("True")
}
3、必须显式比较
b := true
// fmt.Println(b + 1) // 错误:bool 不能参与数学运算
5. 字符串类型
5.1 字符串的本质
1、底层结构:Go 的字符串是一个 只读的字节切片([]byte),存储的是 UTF-8 编码的 Unicode 字符。
2、不可变性:字符串一旦创建,内容不可修改(若需修改需转为 []byte 或 []rune)。
代码示例如下:
package mainimport ("fmt""reflect"
)//演示golang中string 的类型使用
func main(){var str1 = "北京欢迎您"fmt.Println("1、", str1)fmt.Println("sizeof(strl) is", len(str1))fmt.Println("typeof(strl) is", reflect.TypeOf(str1))// 字符串拼接方式str1 += "为您开天辟地"fmt.Println("2、", str1)// 字符串拼接需要换行的时候,需要将操作符,例如+,保留在上面一行否则报错str1 += "hello" + "world" +"666"fmt.Println("3、", str1)// 反引号引用无需转义,原样输出str1 = `var str1 = "北京欢迎您"fmt.Println("1、", str1)fmt.Println("sizeof(strl) is", len(str1))fmt.Println("typeof(strl) is", reflect.TypeOf(str1))`fmt.Println("4、", str1)// str1[0] = 'A'
}运行结果:
1、 北京欢迎您
sizeof(strl) is 15
typeof(strl) is string
2、 北京欢迎您为您开天辟地
3、 北京欢迎您为您开天辟地helloworld666
4、var str1 = "北京欢迎您"fmt.Println("1、", str1)fmt.Println("sizeof(strl) is", len(str1))fmt.Println("typeof(strl) is", reflect.TypeOf(str1))
5.2 常用字符串处理函数(strings包)
| 函数 | 说明 | 示例 |
|---|---|---|
| strings.Contains(s, substr) | 检查是否包含子串 | Contains(“Hello”, “ell”) → true |
| strings.HasPrefix(s, prefix) | 检查是否以某前缀开头 | HasPrefix(“Go”, “G”) → true |
| strings.HasSuffix(s, suffix) | 检查是否以某后缀结尾 | HasSuffix(“World”, “ld”) → true |
| strings.Split(s, sep) | 按分隔符拆分字符串 | Split(“a,b,c”, “,”) → [“a”,“b”,“c”] |
| strings.Join(slice, sep) | 将字符串切片连接 | Join([]string{“a”,“b”}, “-”) → “a-b” |
| strings.ToUpper(s) | 转为大写 | ToUpper(“go”) → “GO” |
| strings.ToLower(s) | 转为小写 | ToLower(“GO”) → “go” |
| strings.TrimSpace(s) | 去除首尾空白字符 | TrimSpace(" Hi ") → “Hi” |
5.3 修改字符串的方式
若需频繁操作字节/字符,可先转为 []byte 或 []rune:
s := "Hello"
bytes := []byte(s)
bytes[0] = 'h' // 修改后转回字符串
s = string(bytes) // "hello"
6. 数据默认值
Go语言数据默认值均为0(字符串空,nil,false均为0的别名)。
| 类型 | 默认值(零值) | 说明 |
|---|---|---|
| 整数类型 | 0 | 包括 int, int8, int16, int32, int64, uint, uint8 等。 |
| 浮点类型 | 0.0 | 包括 float32, float64。 |
| 布尔类型 | false | bool 类型的零值。 |
| 字符串类型 | “” | (空字符串) |
| 指针类型 | nil | 所有指针(如 *int, *string)的零值。 |
| 引用类型 | nil | 包括 slice(切片)、map(映射)、channel(通道)、func(函数)。 |
| 结构体类型 | 所有字段的零值 | 结构体的每个字段会递归初始化为其类型的零值。 |
| 数组类型 | 所有元素为对应零值 | 如 var arr [3]int 的零值是 [0, 0, 0]。 |
| 接口类型 | nil | 接口变量在未赋值时的零值。 |
| 错误类型 | nil | error 类型的零值。 |
| 代码示例: |
package mainimport ("fmt"
)func main(){var a int // 0var b float32 // 0var c float64 // 0var d bool // flasevar name string // ""//%v 表示按照变量的值输出fmt.Printf("a = %v, b = %v, c = %v, d = %v, name = %v", a, b, c, d, name)
}运行结果:
a = 0, b = 0, c = 0, d = false, name =
7. 类型转换
Go语言在不同类型的变量之间赋值时需要显示转换。也就是说Go语言数据类型不会自动转换。
1、强制类型转换既可以从小范围数据类型转换到大范围数据类型(上行转换)、也可以从大范围数据类型转换到小范围数据类型(下行转换)
2、被转换的是变量存储的数据(数值),变量本身的数据类型并没有发生改变
3、在转换中,可能出现意想不到的结果,特别是下行转换的时候。
示例代码如下:
从代码很容易看出转换语法:type(var),这里需要注意,和C语言不同,C语言是(type)var。
当转换溢出时,数据会错误。
如int64的变量转换为int8,则需要取余256.(网上某个培训班网课说无法计算,实际是可计算的,数据溢出之后从0开始,是一个循环)
package mainimport ("fmt"
)func main(){var i int32 = 100var n1 float32 = float32(i)var n2 int8 = int8(i)var n3 int64 = int64(i)fmt.Printf("i = %v n1 = %v n2 = %v n3 = %v", i, n1, n2, n3)// 被转换的是变量的数据,而不是变量的类型fmt.Printf("i type is %T", i)var num1 int64 = 999999var num2 int8 = int8(num1)fmt.Println("num2 = ", num2)num1 = 257num2 = int8(num1)fmt.Println("num2 = ", num2)
}
相关文章:
GO语言-数据类型
文章目录 变量定义1. 整数类型2. 浮点类型3. 字符类型4. 布尔类型5. 字符串类型5.1 字符串的本质5.2 常用字符串处理函数(strings包)5.3 修改字符串的方式 6. 数据默认值7. 类型转换 变量定义 代码如下: package mainimport "fmt"var i1 1000 var i2 i…...
低资源需求的大模型训练项目---3、综合对比与选型建议
综合对比与选型建议 1. Qwen2.5-0.5B 适用性分析: • 优势: • 工业级全流程支持:阿里云提供了完整的预训练、微调、强化学习(RLHF)代码和文档,支持从数据处理到模型部署的全链路实践。 • 性能与场景适配…...
设计模式 四、行为设计模式(2)
五、状态模式 1、概述 状态设计模式是一种行为型设计模式,它允许对象在其内部状态发生时改变其行为,这种模式可以消除大量的条件语句,并将每个状态的行为封装到单独的类中。 状态模式的主要组成部分如下: 1)上…...
FEA 仿真助力高速连接器设计中的信号完整性
各行各业高速信号软件和硬件的快速发展,带来了更高的频率和带宽。因此,对连接器组件的整体性能要求也更加严格。同时,器件和封装形式、互连以及系统内其他设备的小型化也带来了额外的设计挑战。所有这些都对信号传输完整性产生重大影响。 高速…...
yum的基本操作和vim指令
在我们的手机端或者Windows上下载软件,可以在相应的应用商店或者官网进行下载,这样对于用户来说十分的方便和便捷。而在Linux上,也有类似的安装方式,我们来一一了解一下。 Linux安装软件的3种方法 源代码安装 在Linux下安装软件…...
synchronize 或者lock 锁常见的使用场景
在 Java 多线程编程中,synchronized 和 Lock(如 ReentrantLock)是两种常见的线程同步机制。以下是它们的核心区别和典型使用场景,结合代码示例说明: 一、synchronized 的常见场景 1. 简单的临界区保护 public class …...
Qt触摸屏隐藏鼠标指针
Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 使用Qt开发的屏幕软件HMI不需要显示鼠标,qt设置,可以在只启动HMI的时候隐藏光标,退出时再显示。 1.如果只希望在某个 widget 中不显示鼠标指针…...
LangGraph——Agent AI的持久化状态
LangGraph 内置了一个持久化层,通过检查点(checkpointer)机制实现。当你使用检查点器编译图时,它会在每个超级步骤(super-step)自动保存图状态的检查点。这些检查点被存储在一个线程(thread)中,可在图执行后随时访问。由于线程允许在执行后访…...
【双指针】专题:LeetCode 1089题解——复写零
复写零 一、题目链接二、题目三、算法原理1、先找到最后一个要复写的数——双指针算法1.5、处理一下边界情况2、“从后向前”完成复写操作 四、编写代码五、时间复杂度和空间复杂度 一、题目链接 复写零 二、题目 三、算法原理 解法:双指针算法 先根据“异地”操…...
HTTP 1.1 比 HTTP1.0 多了什么?(详尽版)
相较于HTTP 1.0,1.1 版本增加了以上特性: 1. 新增了连接管理即 keepalive,允许持久连接。 定义: Keepalive允许客户端和服务器在完成一次请求-响应后,保持连接处于打开状态,以便后续请求复用同一连接&am…...
【C++初学】C++核心编程(一):内存管理和引用
前言 在C的世界里,面向对象编程(OOP)是核心中的核心。它不仅是一种编程范式,更是一种思考问题的方式。本文将带你从C的内存分区模型出发,深入探讨引用、函数、类和对象、继承、多态以及文件操作等核心概念。通过丰富的…...
深度学习(对抗)
数据预处理:像素标记与归一化 在 GAN 里,图像的确会被分解成一个个像素点来处理。在你的代码里,transform transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) 这部分对图像进行了预处理: tra…...
(PC+WAP)大气滚屏网站模板 电气电力设备网站源码下载
源码介绍 (PCWAP)大气滚屏网站模板 电气电力设备网站源码下载。PbootCMS内核开发的网站模板,该模板适用于滚屏网站模板、电气电力设备网站源码等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可;PCWAP,…...
笔试专题(九)
文章目录 十字爆破(暴力)题解代码 比那名居的桃子(滑动窗口/前缀和)题解代码 分组(暴力枚举 优化二分)题解代码 十字爆破(暴力) 题目链接 题解 1. 暴力 预处理 2. 如果单纯的暴…...
3 VS Code 配置优化与实用插件推荐:settings.json 详解、CodeGeeX 智能编程助手及插件离线安装方法
1 优化 settings.json 文件 1.1 settings.json 简介 settings.json 是 VS Code 的核心配置文件,用于存储用户的个性化设置和偏好。通过该文件,用户可以自定义和覆盖 VS Code 的默认行为,包括但不限于以下方面: 编辑器外观&#…...
TA学习之路——1.6 PC手机图形API介绍
1前言 电脑的工作原理:电脑是由各种不同的硬件组成,由驱动软件驱使硬件进行工作。所有的软件工程师都会直接或者间接的使用到驱动。 定义:是一个图形库,用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序接口(API)。…...
【android bluetooth 框架分析 02】【Module详解 2】【gd_shim_module 模块介绍】
1. 背景 上一章节 我们介绍了 module_t 的 大体框架 ,本节内容我们就选择 我们的 gd_shim_module 模块为例子,具体剖析一下,它里面的逻辑。 static const char GD_SHIM_MODULE[] "gd_shim_module";// system/main/shim/shim.cc …...
从一堆新闻正文中,提取出“事实型句子(fact)”,并保存到新文件中
示例代码: import os import re import json import nltk from tqdm import tqdm from transformers import pipeline nltk.download(punkt) from nltk.tokenize import sent_tokenize ## Check If Fact or Opinion #lighteternal/fact-or-opinion-xlmr-elfact_opi…...
Matlab 调制信号和fft变换
1、内容简介 Matlab 194-调制信号和fft变换 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
Git 常用命令集与实际使用 Demo
Git 常用命令集与实际使用 Demo 一、初始化 & 配置 命令说明Demogit init在当前目录初始化本地 Git 仓库,生成 .git/ 文件夹mkdir newProject && cd newProject git initgit config --global user.name “xxx”设置全局用户名git config --global use…...
KaiwuDB:面向AIoT场景的多模融合数据库,赋能企业数字化转型
引言 在万物互联的AIoT时代,企业面临着海量时序数据处理、多模数据融合和实时分析等挑战。KaiwuDB应运而生,作为一款面向AIoT场景的分布式、多模融合、支持原生AI的数据库产品,为企业提供了一站式数据管理解决方案。 产品概述 KaiwuDB是一…...
STM32 vs ESP32:如何选择最适合你的单片机?
引言 在嵌入式开发中,STM32 和 ESP32 是两种最热门的微控制器方案。但许多开发者面对项目选型时仍会感到困惑:到底是选择功能强大的 STM32,还是集成无线的 ESP32? 本文将通过 硬件资源、开发场景、成本分析 等多维度对比…...
100M/1000M 以太网静电浪涌防护方案
方案简介 以太网是一种生产较早且广泛应用的局域网通讯方式,同时也是一种协议,其核 心在于实现区域内(如办公室、学校等)的网络互联。根据数据传输速度的不同,以 太网大致可以划分为几个等级:标准以太网…...
使用ADB工具分析Android应用崩溃原因:以闪动校园为例
使用adb工具分析模拟器或手机里app出错原因以闪动校园为例 使用ADB工具分析Android应用崩溃原因:以闪动校园为例 前言 应用崩溃是移动开发中常见的问题,尤其在复杂的Android生态系统中,找出崩溃原因可能十分棘手。本文将以流行的校园应用&q…...
C语言中while的相关题目
一、题目引入 以下程序中,while循环的循环次数是多少次? 二、代码分析 首先要明确的一点 while循环是当循环条件为真 就会一直循环 不会停止 while中i是小于10的 说明i可以取到0 1 2 3 4 5 6 7 8 9 进入第一个if判断i小于1为真时执行continue i0是为真的 执行continue 后…...
关于使用 nuitka进行构建python应用的一些配置,以及github action自动构建;
1. 通用配置 # 设置输出目录和文件名output_dir "dist"app_name "CursorAutoFree"# 基础命令行选项base_options ["--follow-imports", # 跟踪导入"--enable-plugintk-inter", # 启用 Tkinter 支持"--include-packagecusto…...
[Dify] 基于明道云实现金融业务中的Confirmation生成功能
在金融业务的日常流程中,交易记录的处理不仅涉及数据录入、流程审批,更重要的是其最终输出形式——交易确认函(Confirmation)。本文将介绍如何通过明道云的打印模板功能,快速、准确地生成符合业务需求的交易Confirmation,提升工作效率与合规性。 为什么需要Confirmation?…...
「Unity3D」图片导入选项取消Read/Write,就无法正确显示导入大小,以及Addressable打包无法正确显示的问题
如果在Edit -> Project Settings -> Editor中的“Load texture data on demand”勾选,就会让图片导入设置中,不勾选Read/Write,就无法正确显示纹理的大小数字。 更进一步的问题是,使用Addressable打包的时候, 如…...
使用Java截取MP4文件图片的技术指南
在多媒体处理中,从视频文件中截取图片是一个常见的需求。本文将详细介绍如何使用Java结合FFmpeg实现从MP4文件中截取图片的功能。我们将通过几种不同的方法来实现这一目标,包括直接调用FFmpeg命令行工具、使用JavaCV库以及使用JAVE库。 环境准备 在开始…...
在C盘新建文本文档
设定 C: 的 NTFS 文件夹权限为 Users 或 Domain Users 具有写入权限; 1. 选中C盘 2. 点右键选中属性(properties) 3. 选“安全”(Security) Tab 4. Users 5. “编辑”(Edit) 6. Full Control …...
