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 _数组和切片的更多相关文章

  1. Groovy语言学习--语法基础(5)

    至此groovy语言学习-语法基础就结束了,新的工作已经安排下来,要干活了. 对groovy了解到一定程度之后就可以在java项目中对其进行引入了.为此新建了一个微型的项目,个人觉得千言万语不如代码实 ...

  2. Groovy语言学习--语法基础(1)

    2018年11月末,从上家公司离职后进入现在的公司.进入项目以来,发现项目中有很多groovy脚本,以前没接触过groovy,抽时间系统地学一下,也方便后期项目的开发和维护. groovy和java的 ...

  3. Go语言学习之4 递归&闭包&数组切片&map&锁

    主要内容: 1. 内置函数.递归函数.闭包2. 数组与切片3. map数据结构4. package介绍 5. 排序相关 1. 内置函数.递归函数.闭包 1)内置函数 (1). close:主要用来关闭 ...

  4. oc语言学习之基础知识点介绍(一):OC介绍

      一.第一个OC程序 #import <Foundation/Foundation.h> //导入头文件 int main(int argc, const char * argv[]) ...

  5. C语言学习018:strdup复制字符串数组

    在C语言学习005:不能修改的字符串中我们知道字符串是存储在常量区域的,将它赋值给数组实际是将常量区的字符串副本拷贝到栈内存中,如果将这个数组赋值给指针,我们可以改变数组中的元素,就像下面那样 int ...

  6. Golang基础(3):数组,切片和字典

    一:数组 数组是一个具有相同类型元素,固定长度的有序集合,一般定义如下:var x [5]int表示数组是一个整数型数组,长度为5数组的几种定义方式 a: var来定义数组,然后依次赋值 packag ...

  7. go语言之字符串、指针、数组、切片、结构struct、面向对象

    一: 字符串 概述: Go 语言将字符串作为 种原生的基本数据类型,字 符串的初始化可以使用字符串字面量. (1)字符串是常量,可以通过类 数组 索引访问其字节单元,但是不能修改某个字节的值 (2)宇 ...

  8. c语言学习之基础知识点介绍(十七):写入读取结构体、数组、结构体数组

    一.结构体的写入和读取 //写入结构体 FILE *fp = fopen("/Users/ios/Desktop/1.data", "w"); if (fp) ...

  9. c语言学习之基础知识点介绍(十):数组

    本节主要介绍数组. 一.数组 /* 数组:一个变量可以存n个变量. 语法:类型 数组名[长度(正整数)]; 例如:int score[5];//定义了一个int类型的数组,长度为5,可以保存5个数据. ...

  10. Go语言学习笔记(三)数组 & 切片 & map

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 数组 Arrays 数组是同一种数据类型的固定长度的序列. 数组是值类型,因此改变副本的值,不会改变本身的值: 当 ...

随机推荐

  1. 新版的Django Docker部署方案,多阶段构建、自动处理前端依赖

    前言 前几天的文章中,我们已经把使用 pdm 的项目用 docker 搞定了,那么下一步就是把完整的 DjangoStarter v3 版本用 docker 部署. 现在不像之前那么简单直接一把梭了, ...

  2. 09-canvas绘制坐标系

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  3. SMU 2024 spring 天梯赛2

    SMU 2024 spring 天梯赛2 7-1 计算指数 - SMU 2024 spring 天梯赛2 (pintia.cn) #include <bits/stdc++.h> usin ...

  4. 软件开发工程师,几款常用的APP,你用过几款?最后一个测试网络必备

    作为一名程序员,手机里一定有几个常用的app,下面给大家推荐几款. 1. CSDN 国内最大编程论坛:虽然有多少人吐槽现在使用csdn就像屎里淘金, 但是不得不承认他仍然是大家搜索技术资料.问题的首选 ...

  5. 基于surging的产品项目-木舟开源了!

    一 . 概述 因为前段时间电脑坏了,导致代码遗失,踌躇满志马上上线的平台产品付之东流,现在熬夜在写代码希望能尽快推出企业正常使用的平台产品,而这次把代码开源,一是让大家对surging 使用有个深入的 ...

  6. vscode使用说明

    # 要经常保存 # centos打开vscode方式 普通用户:[bw@localhost ~]$ /usr/share/code/bin/code 超级用户:[root@localhost shar ...

  7. docker安装cdh6.3.2集群(联网版)

    一.前言 本次采用的在线安装方式,cdh为6.3.2版本,系统为centos7.4, docker节点可以为任意多个,下文将以3个docker容器为示例进行展示.此方法也可用在docker swarm ...

  8. java_String方法大全

    1 String a = "abcdefg"; 2 3 String a = new String(); 4 String a = new String("abcdefg ...

  9. 第1章-JSP 简介

    目录 什么是JSP 安装配置JSP运行环境 JSP页面 JSP页面简介 设置Web服务目录 JSP运行原理 JSP 与Java Servlet的关系 HTML与JavaScript 什么是JSP ★ ...

  10. 第二章:智能Agent

    第二章:智能Agent 本章讨论Agent的本质,Agent是否完美,环境的多样性,及由此带来的各种Agent分类. 1. Agnet和环境 Agent通过传感器感知环境并通过执行器对所处环境产生影响 ...