数组概念

1、数组:是同一种数据类型的固定长度的序列。

2、数组定义:var a [len]int,比如:var a[5]int,一旦定义,长度不能变

3、长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型

4、数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1

5、访问越界,如果下标在数组合法范围之外,则触发访问越界,会panic

6、数组是值类型,因此改变副本的值,不会改变本身的值

7、数组内的内存地址是连续的

数组初始化

var age0 [5]int = [5]int{1,2,3}
var age1 = [5]int{1,2,3,4,5}
var age2 = […]int{1,2,3,4,5,6}
var str = [5]string{3:”hello world”, 4:”tom”}

数据遍历常用两种方法:

  • 方法一
for i := 0; i < len(a); i++ {
}
  • 方法二
for index, val := range a {
}

案例一:定义一个a数组,传入函数test的数组是副本,不会改变原a数组的内容。

package main

import "fmt"

func test(arr [5]int) {
arr[0] = 1000
} func main() {
var a [5]int
test(a)
fmt.Println(a)
}

案例二:定义一个a数组,传入函数test的是a数组的指针,会改变原a数组的内容

package main

import "fmt"

func test3(arr *[5]int) {
(*arr)[0] = 1000
} func main() {
var a [5]int
test3(&a)
fmt.Println(a)
}

多维数组

package main

import "fmt"

func testArray() {
var a [2][5]int = [...][5]int{{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}} for row, v := range a {
for col, v1 := range v {
fmt.Printf("(%d,%d)=%d ", row, col, v1)
}
fmt.Println()
}
} func main() {
testArray()
}

切片概念

1、切片:切片是数组的一个引用,因此切片是引用类型

2、切片的长度可以改变,因此,切片是一个可变的数组

3、切片遍历方式和数组一样,可以用len()求长度

4、cap可以求出slice最大的容量,0 <= len(slice) <= (array),其中array是slice引用的数组

5、切片的定义:var 变量名 []类型,比如 var str []string var arr []int

切片初始化:var slice []int = arr[start:end],包含start到end之间的元素,但不包含end
var slice []int = arr[0:end]可以简写为 var slice []int=arr[:end]
var slice []int = arr[start:len(arr)] 可以简写为 var slice[]int = arr[start:]
var slice []int = arr[0, len(arr)] 可以简写为 var slice[]int = arr[:]
如果要切片最后一个元素去掉,可以这么写: slice = slice[:len(slice)-1]
  • nil切片和空切片
var nilSlice []int  //nil切片
slice:=[]int{} //空切片

它们的长度和容量都是0,但是它们指向底层数组的指针不一样,nil切片意味着指向底层数组的指针为nil,而空切片对应的指针是个地址。

  • 切片的内存布局:

  • 通过make创建切片语法如下:
var slice []type = make([]type, len)
slice := make([]type, len)
slice := make([]type, len, cap)

func testSliceCap() {
a := make([]int, 5, 10)
a[4] = 100
b := a[2:3]
fmt.Printf("a=%#v, len(a) = %d, cap(a)=%d\n", a, len(a), cap(a))
fmt.Printf("b=%#v, len(b) = %d, cap(b)=%d\n", b, len(b), cap(b))
}

  • 用append内置函数操作切片
func testAppend() {
var a []int
a = make([]int, 5)
var b []int = []int{10, 11, 12, 14}
a = append(a, b...)
fmt.Printf("a:%#v\n", a)
}

  • 遍历切片
for index, val := range slice {
}
  • 切片拷贝copy
func testCopy() {
var a []int = []int{1, 2, 3, 4, 5, 6}
b := make([]int, 10)
copy(b, a)
fmt.Println(b)
}

  • string底层就是一个byte的数组,因此,也可以进行切片操作

  • string本身是不可变的,因此要改变string中字符,需要如下操作:

字符串转成字符切片,改完后再转成字符串

func testStrSlice() {
var str = "hello world"
var b []byte = []byte(str)
b[0] = 'a'
str1 := string(b)
fmt.Printf("str1:%s, %d\n", str1, len(str))
}

排序和查找操作

排序操作主要都在 sort包中,导入就可以使用

  • sort.Ints对整数进行排序, sort.Strings对字符串进行排序, sort.Float64s对浮点数进行排序
func testIntSort() {
var a = [...]int{1, 8, 38, 2, 348, 484}
sort.Ints(a[:])
fmt.Println(a)
}
  • sort.SearchInts(a []int, b int) 从数组a中查找b,前提是a必须有序
func testIntSearch() {
var a = [...]int{1, 8, 38, 2, 348, 484}
sort.Ints(a[:])
index := sort.SearchInts(a[:], 348)
fmt.Println(index)
}
  • sort.SearchFloats(a []float64, b float64) 从数组a中查找b,前提是a必须有序
  • sort.SearchStrings(a []string, b string) 从数组a中查找b,前提是a必须有序

go 数组与切片的更多相关文章

  1. GO语言总结(3)——数组和切片

    上篇博文简单介绍了一下Go语言的基本类型——GO语言总结(2)——基本类型,本篇博文开始介绍Go语言的数组和切片. 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. ( ...

  2. golang笔记——数组与切片

    一.切片的定义 我们可以从数组(go语言中很少直接使用数组)或者切片来初始化一个新的切片,也可以直接通过 make 来初始化一个所有元素为默认零值的切片. //1.通过数组来初始化切片 arr := ...

  3. Go - 数组 和 切片(array、slice)

    一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建 数组有 3 种创建方式: 1) [length]Type 2) [length]Type{value ...

  4. GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...

  5. Go数组、切片、映射的原理--简明解析

    数组.切片.映射是Golang的最重要的数据结构,下面是对这3种数据结构的一点个人总结: 一.数组 数组是切片和映射的基础数据结构. 数组是一个长度固定的数据类型,存储着一段具有相同数据类型元素的连续 ...

  6. go语言的数组和切片区别

    这里不介绍数组和切片的使用技巧,主要看下2者的区别. 首先看下它们的定义: 数组:类型 [n]T 表示拥有 n 个 T 类型的值的数组. 切片:类型 []T 表示一个元素类型为 T 的切片. 看一个数 ...

  7. go语言基础知识笔记(二)之数组和切片

    数组和切片知识用的也是比较多,的给我们工作带来很大的便利 (一) 数组 定义:在golang中数组的长度是不可变,数组存放要求是同一种数据类型 //golang中数组定义的四种方法1.先声明,后赋值 ...

  8. Go语言--数组、切片、

    3.1 数组--固定大小的连续空间 3.1.1 声明数组 写法 var 数组变量名 [元素数量]T 说明: 变量名就是使用时的变量 元素的数量可以是表达式,最后必须为整型数值 T 可是是任意基本类型, ...

  9. Go语言数组和切片的原理

    目录 数组 创建 访问和赋值 切片 结构 初始化 访问 追加 拷贝 总结 数组和切片是 Go 语言中常见的数据结构,很多刚刚使用 Go 的开发者往往会混淆这两个概念,数组作为最常见的集合在编程语言中是 ...

  10. Numpy 笔记: 多维数组的切片(slicing)和索引(indexing)【转】

    目录 切片(slicing)操作 索引(indexing) 操作 最简单的情况 获取多个元素 切片和索引的同异 切片(slicing)操作 Numpy 中多维数组的切片操作与 Python 中 lis ...

随机推荐

  1. 《Linux内核设计与实现》第七章读书笔记

    第七章.中断和中断处理 7.1中断 中断使得硬件得以发出通知给处理器.中断随时可以产生,内核随时可能因为新来到的中断而被打断. 不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标志.操作系统给 ...

  2. CSS编码规则

    /* 和HTML一样使用两个空格来代替制表符 */ div { /* 为了代码的易读性,在每个声明块的左花括号前添加一个空格 */' padding: 15px; /* 每个声明语句的:后应该插入一个 ...

  3. idea使用优化

    一.idea设置目录说明 1.bin目录包含我们的启动文件.虚拟机配置信息和idea属性信息等 2.help目录:帮助文档 3.jre64 : idea自带的jre环境 4.lib:idea所依赖的类 ...

  4. 关于本科毕业论文《Laguerre小波在数值积分与微分方程数值解中的应用》存在的问题与小结

    本科的毕业设计<Laguerre小波在数值积分与微分方程数值解中的应用>是通过Laguerre小波函数来近似表达某个需要求积分或解微分方程的函数,将原函数很难求得函数用小波函数表达出来,这 ...

  5. beanutils的使用

    在项目进行中,使用到beanutils时发现1.9.X以上版本搭配logging搭配使用用不了,实在搞不明白.----stackoverflow提问吧 BeanUtils工具由Apache软件基金组织 ...

  6. JSP中properties文件的路径问题

    做练习的时候,写了个properties文件,放在src/servlet/目录下,访问文件问题花了点时间折腾,最终得到解决,记下. 环境:eclipse jee oxygen,tomcat 9.0. ...

  7. Spring Cloud的Zuul的使用问题

    Zuul Client 放在移动App中,Zuul Server可以做集群. Zuul Client放在jar包吗?ios怎么办? Zuul与Spring Security配合使用,与Shiro做集成 ...

  8. Axios插件和loading的实现

    axios插件就是一个ajax插件 axios具有ajax的所有方法如 get post delete put等等的方法 使用时只需要引入即可 如import Axios form 'axios' 不 ...

  9. Jquery 组 表单验证

    <!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...

  10. Delphi之Exception获得错误信息(简单好理解)

    Delphi之Exception获得错误信息 相关资料: http://www.cnblogs.com/hackpig/archive/2010/02/15/1668547.html 实例代码: 1 ...