Go 之 语言基本类型

一、基本类型及其特性和用途

类型长度(字节)默认值说明
bool1false布尔值,表示真假
byte10别名为 uint8,用于表示ASCII字符或其他小整数值
rune40别名为 int32,表示一个Unicode码点
intuint4 或 80有符号和无符号整数,具体长度取决于系统架构(32位或64位系统)
int8uint810有符号范围:-128 ~ 127;无符号范围:0 ~ 255,byte 是 uint8 的别名
int16uint1620有符号范围:-32,768 ~ 32,767;无符号范围:0 ~ 65,535
int32uint3240有符号范围:-2,147,483,648 ~ 2,147,483,647;无符号范围:0 ~ 4,294,967,295,rune 是 int32 的别名
int64uint6480有符号范围:-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807;无符号范围:0 ~ 18,446,744,073,709,551,615
float3240.0单精度浮点数
float6480.0双精度浮点数
complex648复数,实部和虚部都是 float32
complex12816复数,实部和虚部都是 float64
uintptr4 或 8用于存储指针的整数类型,具体长度取决于系统架构
array--固定大小的数组,值类型
struct--结构体,包含多个字段的聚合类型,值类型
string-""UTF-8 编码的字符串,值类型
slice-nil动态大小的数组,引用类型
map-nil键值对集合,引用类型
channel-nil用于goroutine之间通信的通道,引用类型
interface-nil接口类型,定义了一组方法集
function-nil函数类型,可以作为参数传递或返回

二、byte 和 rune 区别

  • byte:适用于处理ASCII字符或单字节数据,通常用于处理纯英文文本或简单的二进制数据。
  • rune:适用于处理Unicode字符,特别是包含多字节字符的语言(如中文、日文等)。在处理复杂的字符串操作时,建议使用 rune 类型以确保字符的正确解析。

案例:

package mainimport ("fmt"
)func main() {str := "Hello你好"// 使用 byte 类型遍历字符串fmt.Println("Using byte:")for i := 0; i < len(str); i++ {fmt.Printf("Character: '%c', value: %d\n", str[i], str[i])}// 使用 rune 类型遍历字符串fmt.Println("\nUsing rune:")for _, r := range str {fmt.Printf("Character: '%c', value: %d\n", r, r)}
}// 输出Using byte:
Character: 'H', value: 72
Character: 'e', value: 101
Character: 'l', value: 108
Character: 'l', value: 108
Character: 'o', value: 111
Character: 'ä', value: 228
Character: '½', value: 189
Character: '?', value: 63Using rune:
Character: 'H', value: 72
Character: 'e', value: 101
Character: 'l', value: 108
Character: 'l', value: 108
Character: 'o', value: 111
Character: '你', value: 20320
Character: '好', value: 22909

使用 byte 类型遍历时,由于字符串包含多字节字符(如“你好”),会出现乱码现象;而使用 rune 类型遍历时,则能正确解析每个字符。

三、new 与 make 的区别

特性new(T)make(T, args...)
适用类型任何类型,包括结构体、数组、基本类型仅适用于切片、映射和通道
返回值返回 *T(指向 T 的指针)返回 T(类型本身,已初始化)
初始化方式零值初始化根据参数进行初始化
用途分配内存并返回指针创建并初始化切片、映射或通道
package mainimport ("fmt"
)func main() {// 使用 new 创建映射指针mNew := new(map[string]int)fmt.Printf("%v, %T\n", mNew, mNew) // 输出: &map[], *map[string]intfmt.Println(*mNew)                 // 输出: map[] (实际上是 nil)// 尝试直接对 nil 映射进行赋值会导致 panic// (*mNew)["key"] = 10 // 这行代码会引发 panic// 方法1:使用 make 初始化映射,并将其赋值给指针指向的映射*mNew = make(map[string]int)(*mNew)["key"] = 10fmt.Println(*mNew) // 输出: map[key:10]// 方法2:使用字面量初始化映射,并将其赋值给指针指向的映射*mNew = map[string]int{"anotherKey": 20}fmt.Println(*mNew) // 输出: map[anotherKey:20]// 使用 make 创建映射mMake := make(map[string]int)fmt.Printf("%v, %T\n", mMake, mMake) // 输出: map[], map[string]intmMake["key"] = 10fmt.Println(mMake) // 输出: map[key:10]// 也可以将 mMake 赋值给 mNew 指向的映射*mNew = mMake(*mNew)["key"] = 30fmt.Println(*mNew) // 输出: map[key:30]
}

综上像 slice、map、channel 这三种还是用make比较合适。

四、array 数组

1、初始化数组

// 初始化一个包含5个整数的数组
arr := [5]int{1, 2, 3, 4, 5} // 初始化前两个元素,其余为0 // 结果: [1, 2, 0, 0, 0]
arr := [5]int{1, 2} // 编译器会自动推断数组长度为5
arr := [...]int{1, 2, 3, 4, 5} // 赋值3和4位置得值 ["", "", "", "hello world", "tom"]
var str = [5]string{3: "hello world", 4: "tom"} 

2、多维数组

// 声明一个二维数组
matrix := [2][3]int{{1, 2, 3},{4, 5, 6},
}// 使用省略号自动推断长度,注意 第 2 纬度不能用 "..."
matrix := [...][3]int{{1, 2, 3},{4, 5, 6},
}

3、遍历数组

arr := [5]int{1, 2, 3, 4, 5}// for 模式
for i := 0; i < len(arr); i++ {fmt.Printf("arr[%d] = %d\n", i, arr[i])
}// range 模式
for i, v := range arr {fmt.Printf("arr[%d] = %d\n", i, v)
}

五、slice 切片

        切片是对底层数组的一个引用,因此多个切片可以共享同一个底层数组。长度(length)表示切片中当前元素的数量。 容量(capacity)表示切片底层数组中从切片起始位置到数组末尾的元素数量。

1、切片的创建、初始化、遍历、修改以及常见操作

package mainimport ("fmt"
)func main() {// 使用 make 创建切片s1 := make([]int, 5, 10)fmt.Println("s1:", s1) // 输出: [0 0 0 0 0]// 直接初始化切片s2 := []int{1, 2, 3, 4, 5}fmt.Println("s2:", s2) // 输出: [1 2 3 4 5]// 从数组创建切片arr := [6]int{1, 2, 3, 4, 5, 6}s3 := arr[1:4]fmt.Println("s3:", s3) // 输出: [2 3 4]// 遍历切片for i, v := range s2 {fmt.Printf("s2[%d] = %d\n", i, v)}// 修改切片元素s2[0] = 10fmt.Println("After modification:", s2) // 输出: [10 2 3 4 5]// 添加元素s2 = append(s2, 6, 7, 8)fmt.Println("After append:", s2) // 输出: [10 2 3 4 5 6 7 8]// 删除元素s2 = append(s2[:2], s2[3:]...)fmt.Println("After removing element at index 2:", s2) // 输出: [10 2 4 5 6 7 8]// 复制切片dst := make([]int, 3)n := copy(dst, s2)fmt.Println("Copied slice:", dst) // 输出: [10 2 4]fmt.Println("Number of elements copied:", n) // 输出: 3// 切片的切片subSlice := s2[1:4]fmt.Println("Sub-slice:", subSlice) // 输出: [2 4 5]
}
  • 创建:可以使用 make 函数创建切片,或者直接初始化切片。
  • 初始化:可以直接在声明时初始化切片元素,或者从现有数组中创建切片。
  • 访问和修改:通过索引访问和修改切片中的元素。
  • 遍历:可以使用 for 循环或 range 来遍历切片。
  • 添加元素:使用 append 函数向切片添加元素。
  • 删除元素:可以通过切片操作符删除元素。
  • 复制切片:使用 copy 函数将一个切片的内容复制到另一个切片中。
  • 切片的切片:可以从一个切片中创建另一个切片。

2、切片得常规操作

操作含义
s[n]访问切片 s 中索引位置为 n 的项。
s[:]从切片 s 的索引位置 0 到 len(s)-1 处所获得的切片(即整个切片)。
s[low:]从切片 s 的索引位置 low 到 len(s)-1 处所获得的切片。
s[:high]从切片 s 的索引位置 0 到 high 处所获得的切片,长度为 high
s[low:high]从切片 s 的索引位置 low 到 high 处所获得的切片,长度为 high - low
s[low:high:max]从切片 s 的索引位置 low 到 high 处所获得的切片,长度为 high - low,容量为 max - low
len(s)返回切片 s 的长度,表示当前包含的元素数量,总是小于等于 cap(s)
cap(s)返回切片 s 的容量,表示底层数组中从切片起始位置到数组末尾的元素数量,总是大于等于 len(s)
package mainimport ("fmt"
)func main() {s := []int{1, 2, 3, 4, 5}// 访问切片s中索引位置为2的项fmt.Println("s[2]:", s[2]) // 输出: 3// 获取整个切片fmt.Println("s[:]:", s[:]) // 输出: [1 2 3 4 5]// 获取从索引位置1到末尾的切片fmt.Println("s[1:]:", s[1:]) // 输出: [2 3 4 5]// 获取从索引位置0到3的切片fmt.Println("s[:3]:", s[:3]) // 输出: [1 2 3]// 获取从索引位置1到3的切片fmt.Println("s[1:3]:", s[1:3]) // 输出: [2 3]// 获取从索引位置1到3且最大容量为4的切片fmt.Println("s[1:3:4]:", s[1:3:4]) // 输出: [2 3]s := make([]int, 3, 5) // 创建一个长度为3,容量为5的切片s = append(s, 4, 5)    // 添加两个元素fmt.Println("s:", s)           // 输出: [0 0 0 4 5]fmt.Println("len(s):", len(s)) // 输出: 5fmt.Println("cap(s):", cap(s)) // 输出: 5// 获取从索引位置1到3的切片// 子切片的容量由底层数组的容量减去子切片的起始索引决定,所以 cap 容量 5-1subSlice := s[1:3]fmt.Println("subSlice:", subSlice)          // 输出: [0 0]fmt.Println("len(subSlice):", len(subSlice)) // 输出: 2fmt.Println("cap(subSlice):", cap(subSlice)) // 输出: 4
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将Ubuntu操作系统的安装源设置为阿里云

在使用Ubuntu操作系统时,默认的软件源通常是国外的仓库,这可能会导致软件安装和更新速度较慢。为了提高下载速度和稳定性,我们可以将Ubuntu的安装源设置为阿里云镜像源。以下是详细步骤: 一、准备工作 在开始之前,请确保您的Ubuntu系统可以正常上网,并且您拥有管理员权…

基于 Python 的项目管理系统开发

基于 Python 的项目管理系统开发 一、引言 在当今快节奏的工作环境中&#xff0c;有效的项目管理对于项目的成功至关重要。借助信息技术手段开发项目管理系统&#xff0c;能够显著提升项目管理的效率和质量。Python 作为一种功能强大、易于学习且具有丰富库支持的编程语言&…

LabVIEW C编译支持工具库CCompileSupp.llb

路径&#xff1a;C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\CCompileSupp.llb ​ 1. 工具库概述 定位&#xff1a;LabVIEW内置的C语言编译支持工具库&#xff0c;用于处理LabVIEW与C/C代码的混合编程接口&#xff0c;涵盖编译器配置、代码生成…

JVM之JVM的组成

Java 虚拟机&#xff08;JVM&#xff09;是 Java 程序的运行核心&#xff0c;它主要由类加载系统、运行时数据区、执行引擎和本地方法接口这几个关键部分组成。 类加载系统&#xff08;Class Loading System&#xff09; 类加载系统负责在程序运行时动态地将 Java 类加载到 J…

pycharm 调试 debug 进入 remote_sources

解决办法1&#xff1a; pycharm函数跳转到remote_sources中的文件中_pycharm修改remotesource包存放地址-CSDN博客 file->settings->project structure将项目文件夹设为"Sources"&#xff08;此时文件夹会变为蓝色&#xff09;。 解决方法2 Debug:使用Pychar…

iOS App的启动与优化

App的启动流程 App启动分为冷启动和热启动 冷启动&#xff1a;从0开始启动App热启动&#xff1a;App已经在内存中&#xff0c;但是后台还挂着&#xff0c;再次点击图标启动App。 一般对App启动的优化都是针对冷启动。 App冷启动可分为三个阶段&#xff1a; dyld&#xff1a…

StarRocks FE leader节点CPU使用率周期性的忽高忽低问题分析

背景 本文基于 StarRocks 3.3.5 最近在做一些 StarRocks 相关的指标监控的时候&#xff0c;看到了FE master的CPU使用率相对其他FE节点是比较高的&#xff0c;且 呈现周期性的变化&#xff08;周期为8分钟&#xff09;&#xff0c; 于此同时FE master节点的GC频率相对于其他节…

Spring高级篇-Spring IOC容器 Aware 接口

一、概述 在Spring框架中&#xff0c;IOC&#xff08;Inversion of Control&#xff09;容器负责管理应用程序中的对象&#xff08;即Bean&#xff09;的生命周期和依赖关系。Spring提供了一系列的Aware接口&#xff0c;允许Bean在初始化时获取Spring容器中的某些资源或信息。…

数字信任的底层逻辑:密码学核心技术与现实应用

安全和密码学 --The Missing Semester of Your CS Education 目录 熵与密码强度密码散列函数密钥体系 3.1 对称加密 3.2 非对称加密信任模型对比典型应用案例安全实践建议扩展练习杂项 密码学是构建数字信任的基石。 本文浅析密码学在现实工具中的应用&#xff0c;涵盖 1&…

MySQL数据库连接池泄露导致MySQL Server超时关闭连接

前言 最近做项目&#xff0c;发现老项目出现xxx&#xff0c;这个错误其实很简单&#xff0c;出现在MySQL数据库Server端对长时间没有使用的client连接执行清楚处理&#xff0c;因为是druid数据库&#xff0c;且在github也出现这样的issue&#xff1a;The last packet successf…

DirectX12(D3D12)基础教程三 线性代数与3D世界空间

线性代数是数学的一个分支&#xff0c;它的研究对象是向量&#xff0c;向量空间&#xff08;或称线性空间&#xff09;&#xff0c;线性变换和有限维的线性方程组。 向量和矩阵是学习3D入门最基本的理论基础。本章重点讲向量和矩阵. 向量概念 向量最基本的定义就是一个方向和…

LeetCode 230.二叉搜索树中第K小的元素

题目&#xff1a;给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。 思路&#xff1a; 代码&#xff1a; /*** Definition for a binary tree node.* public class Tre…

Android 老项目 jcenter 库失效

最近重新维护了一些老项目发现大部分jcenter库失效了&#xff0c; Could not resolve com.xx:2.1.3. 如果你也遇到了&#xff0c;不妨试试 替换为 aliyun的jcenter服务&#xff0c;就不用一个个找代替库了。 project 下的 build.gradle 文件添加&#xff1a; maven { url htt…

Python数据结构:哈希表-高效存储与查找的秘密武器!

大家周一好&#xff01;今天我们来聊聊Python中一个非常重要的数据结构——哈希表。无论是算法面试还是实际开发&#xff0c;哈希表都扮演着至关重要的角色。掌握它&#xff0c;你就能轻松解决许多复杂的编程问题&#xff01; 在编程中&#xff0c;如何实现快速的存储与查找操…

【复习】Redis

数据结构 Redis常见的数据结构 String&#xff1a;缓存对象Hash&#xff1a;缓存对象、购物车List&#xff1a;消息队列Set&#xff1a;点赞、共同关注ZSet&#xff1a;排序 Zset底层&#xff1f; Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 < 12…

【电机控制器】ESP32-C3语言模型——DeepSeek

【电机控制器】ESP32-C3语言模型——DeepSeek 文章目录 [TOC](文章目录) 前言一、简介二、代码三、实验结果四、参考资料总结 前言 使用工具&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、简介 二、代码 #include <Arduino.h&g…

STM32-智能小车项目

项目框图 ST-link接线 实物图&#xff1a; 正面&#xff1a; 反面&#xff1a; 相关内容 使用L9110S电机模块 电机驱动模块L9110S详解 | 良许嵌入式 一、让小车动起来 新建文件夹智能小车项目 在里面复制19-串口打印功能 重命名为01-让小车动起来 新建文件夹motor&…

Redis基础学习

目录 Redis命令 通用命令 String Key的顶层格式 Hash List ​编辑​编辑Set SortedSet 在IDEA使用Jedis操作Redis 常规使用 Jedis的连接池 SpringDataRedis 手动序列化和反序列化 操作Hash Redis命令 通用命令 想知道某个命令怎么用 1.可以在官网学习用法 h…

ASP.NET Core Clean Architecture

文章目录 项目地址一、项目主体1. CQRS1.1 Repository数据库接口1.2 GetEventDetail 完整的Query流程1.3 创建CreateEventCommand并使用validation 2. EFcore层2.1 BaseRepository2.2 CategoryRepository2.3 OrderRepository 3. Email/Excel导出3.1 Email1. IEmail接口层2. Ema…

MySQL数据库——表的约束

1.空属性&#xff08;null/not null&#xff09; 两个值&#xff1a;null&#xff08;默认的&#xff09;和not null&#xff08;不为空&#xff09; 数据库默认字段基本都是字段为空&#xff0c;但是实际开发时&#xff0c;尽可能保证字段不为空&#xff0c;因为数据为空没办法…