Go语言学习 _基础03 _数组和切片
Go语言学习 _基础03 _数组和切片
1、数组
package array_test
import "testing"
func TestArrayInit(t *testing.T){
var arr [3]int // 声明方式 1
arr1 := [4]int{1,2,3,4} // 声明方式 2
arr2 :=[...]int{1,2,3,4,5} // 声明方式 3 省去对于空间大小的声明 通过初始化来确定 空间大小
arr1[1] = 5
t.Log(arr[1],arr[2])
t.Log(arr1,arr2)
}
func TestArrayTravel(t *testing.T){
arr3 := [...]int{1,2,3,5}
for i := 0; i < len(arr3); i++{ // 传统遍历
t.Log(arr3[i])
}
for idx,e :=range arr3{
t.Log(idx,e) // idx —— 索引值
}
for _,e :=range arr3{ // TODO Go语言有严格的 编程约束,
// TODO 如果 不关心 index 可以使用 下划线 来表示忽略此返回值,但不能没有这个 返回参数的 占位符
t.Log(e) // idx —— 索引值
}
}
// 数组的截取(切片) —— 切头去尾、不可使用负数
func TestArraySection(t *testing.T){
arr3 :=[...]int{1,2,3,4}
arr3_sec := arr3[:] // 全部取
for idx,e :=range arr3_sec{
t.Log(idx,e) // idx —— 索引值
}
arr3_sec = arr3[0:2]
for idx,e :=range arr3_sec{
t.Log(idx,e) // idx —— 索引值
}
}
2、切片
package slice_test
import (
"fmt"
"testing"
)
func TestSliceInit(t *testing.T) {
var s0 []int
t.Log(len(s0), cap(s0))
s0 = append(s0, 1)
t.Log(len(s0), cap(s0))
s1 := []int{1, 2, 3, 4}
t.Log(len(s1), cap(s1))
s2 := make([]int, 3, 5)
t.Log(len(s2), cap(s2))
//t.Log(s2[0],s2[1],s2[2],s2[3],s2[4]) panic: runtime error: index out of range [3] with length 3 [recovered]
// panic: runtime error: index out of range [3] with length 3
t.Log(s2[0], s2[1], s2[2])
// TODO 切片的结构,本质上切片是一个结构体 由 指针 长度(len) 容量(cap) 三个要素组成
// TODO 只有 在 len 范围内 才是可访问的 元素
s2 = append(s2, 1)
t.Log(len(s2), cap(s2))
t.Log(s2[0], s2[1], s2[2], s2[3])
// TODO cap 为切片的 扩充 提供了 空间
}
func TestSliceGrowing(t *testing.T) {
s := []int{}
for i := 0; i < 10; i++ {
s = append(s, i)
t.Log(len(s), cap(s))
t.Log(s)
fmt.Println()
}
// TODO 观察输出 可以看到 每次 存入新元素前 如果会是的 cap < len 那么 cap就会 变成 cap*2
// TODO 来满足增长需求,这也是 为什么 append() 操作之后要把新切片返回给原切片 因为 操作可能带来 空间位置的改变
}
func TestSliceShareMeory(t *testing.T) {
year := []string{"Jan", "Feb", "Mar", "Arp", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
Q2 := year[3:6]
t.Log(Q2, len(Q2), cap(Q2)) // len = 3 ,cap =9 ( cap 会一直 延伸到 这个数组结束的 位置)
summer := year[5:8]
t.Log(summer, len(summer), cap(summer))
summer[0] = "Unknow"
t.Log(Q2)
t.Log(year)
// TODO 从输出 可以观察到 切片共享 内存的 特性
// TODO 如果 源自同一数组的 两个 切片 其一改变 另一个 可能会被影响
}
func TestSliceComparing(t *testing.T) {
//a := []int{1, 2, 3, 4}
//b := []int{1, 2, 3, 4}
//if a == b { // 不能进行比较
// t.Log("equal")
//}
// invalid operation: a == b (slice can only be compared to nil)
}
Go语言学习 _基础03 _数组和切片的更多相关文章
- Groovy语言学习--语法基础(5)
至此groovy语言学习-语法基础就结束了,新的工作已经安排下来,要干活了. 对groovy了解到一定程度之后就可以在java项目中对其进行引入了.为此新建了一个微型的项目,个人觉得千言万语不如代码实 ...
- Groovy语言学习--语法基础(1)
2018年11月末,从上家公司离职后进入现在的公司.进入项目以来,发现项目中有很多groovy脚本,以前没接触过groovy,抽时间系统地学一下,也方便后期项目的开发和维护. groovy和java的 ...
- Go语言学习之4 递归&闭包&数组切片&map&锁
主要内容: 1. 内置函数.递归函数.闭包2. 数组与切片3. map数据结构4. package介绍 5. 排序相关 1. 内置函数.递归函数.闭包 1)内置函数 (1). close:主要用来关闭 ...
- oc语言学习之基础知识点介绍(一):OC介绍
一.第一个OC程序 #import <Foundation/Foundation.h> //导入头文件 int main(int argc, const char * argv[]) ...
- C语言学习018:strdup复制字符串数组
在C语言学习005:不能修改的字符串中我们知道字符串是存储在常量区域的,将它赋值给数组实际是将常量区的字符串副本拷贝到栈内存中,如果将这个数组赋值给指针,我们可以改变数组中的元素,就像下面那样 int ...
- Golang基础(3):数组,切片和字典
一:数组 数组是一个具有相同类型元素,固定长度的有序集合,一般定义如下:var x [5]int表示数组是一个整数型数组,长度为5数组的几种定义方式 a: var来定义数组,然后依次赋值 packag ...
- go语言之字符串、指针、数组、切片、结构struct、面向对象
一: 字符串 概述: Go 语言将字符串作为 种原生的基本数据类型,字 符串的初始化可以使用字符串字面量. (1)字符串是常量,可以通过类 数组 索引访问其字节单元,但是不能修改某个字节的值 (2)宇 ...
- c语言学习之基础知识点介绍(十七):写入读取结构体、数组、结构体数组
一.结构体的写入和读取 //写入结构体 FILE *fp = fopen("/Users/ios/Desktop/1.data", "w"); if (fp) ...
- c语言学习之基础知识点介绍(十):数组
本节主要介绍数组. 一.数组 /* 数组:一个变量可以存n个变量. 语法:类型 数组名[长度(正整数)]; 例如:int score[5];//定义了一个int类型的数组,长度为5,可以保存5个数据. ...
- Go语言学习笔记(三)数组 & 切片 & map
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 数组 Arrays 数组是同一种数据类型的固定长度的序列. 数组是值类型,因此改变副本的值,不会改变本身的值: 当 ...
随机推荐
- 修复 Longhorn 卷挂载失败(”CentOS 7.6-'fsck' found errors on device“)
查看 Pod 日志 kubectl describe po clickhouse-0 -n clickhouse ...... #Events: # Type Reason Age From Mess ...
- RabbitMQ相关总结
//connection //channel //broke //exchange:fanout. dirct. topic(*:一个单词.#:多个单词). header //queue //bind ...
- 在VS Code中使用Snippet Craft扩展提高编码效率
Snippet Craft 一个VS Code代码片段管理插件 功能 创建和插入代码片段 在编辑器区域右键菜单中点击插入Snippet,或在代码片段视图中点击条目,则会将代码片段插入到当前激活文档的光 ...
- 【图文教程】Centos单机安装Redis
1.1.安装Redis依赖 Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖: yum install -y gcc tcl 1.2.上传安装包并解压 例如,凯哥将其放到 ...
- IDEA - ruoyi - srpingboot - 离线运行
前提:有项目对应的repository文件,RY的DB配置正常(mysql新增schema ry, 执行 /sql下的sql文件,同步调整ruoyi-admin下的application-druid. ...
- windows服务器使用 azure devops 批量自动发布网站到IIS
最近由于一个API项目,需要利用负载均衡来做支撑,因此需要将同一份代码分发到多个服务器,之前一直手工干这个活,感觉太累了,去开发交流群,还有搜索了一下资料,发现很多人推荐我用ftp.还有磁盘共享等这种 ...
- ipv6 知识
ref: 网络编程懒人入门(十一):一文读懂什么是IPv6 https://cloud.tencent.com/developer/article/1551346 IT知识大全:IPv6详解
- Redisson 源码分析及实际应用场景之实现延迟队列
redis 参考目录: 生产级Redis 高并发分布式锁实战1:高并发分布式锁如何实现 https://www.cnblogs.com/yizhiamumu/p/16556153.html 生产级Re ...
- Istio实现sidecar自动注入
Istio实现sidecar自动注入 Sidecar模式 在Sidecar部署方式中,你会为每个应用的容器部署一个伴生容器.对于Service Mesh,Sidecar接管进出应用程序容器的所有网络流 ...
- LeetCode 验证二叉搜索树的两种不同题型
一.leetcode 98. 验证二叉搜索树 通过辅助函数增加参数进行判断. 虽然节点值在INT范围内,但要求其中序遍历序列严格单调递增,因此等于也不行,而且需要用LONG_MIN\LONG_MAX初 ...