3.1.数组

(1)数组的定义

package main

import (
"fmt"
) func main() {
//用var定义数组可以不用赋初值
var arr1 [5]int //[0 0 0 0 0]
//用冒号必须指定初值
arr2 := [3]int{1,3,5} //[1 3 5]
//用“...”表示任意个数
arr3 := [...]int{2,4,6,8,10} //[2 4 6 8 10]
fmt.Println(arr1,arr2,arr3)
}

(2)数组的遍历

用range关键字

package main

import (
"fmt"
) func main() {
arr3 := [...]int{2,4,6,8,10} //[2 4 6 8 10]
fmt.Println(arr3) //数组的遍历
for i := range arr3{
fmt.Println(arr3[i])
}
} //结果
2
4
6
8
10

获取下标和值

package main

import (
"fmt"
) func main() {
arr3 := [...]int{2,4,6,8,10} //[2 4 6 8 10]
fmt.Println(arr3) //数组的遍历
for i ,v:= range arr3{
fmt.Println(i,v)
}
} //结果
0 2
1 4
2 6
3 8
4 10

(3)数组是值类型

  • [10]int和[20]int是不同类型
  • 调用func f(arr [10]int) 会拷贝数组
  • 在go语言中一般不使用数组,而使用切片
package main

import (
"fmt"
) func printArray(arr [5]int){
for i ,v:= range arr{
fmt.Println(i,v)
}
} func main() {
//arr2 := [3]int{1,3,5}
arr3 := [...]int{2,4,6,8,10}
printArray(arr3)
} //结果
0 2
1 4
2 6
3 8
4 10

 如果传arr2则报错

package main

import (
"fmt"
) func printArray(arr [5]int){
for i ,v:= range arr{
fmt.Println(i,v)
}
} func main() {
arr2 := [3]int{1,3,5}
//arr3 := [...]int{2,4,6,8,10}
printArray(arr2) //cannot use arr2 (type [3]int) as type [5]int in argument to printArray
}

3.2.切片

(1)切片

package main

import "fmt"

func main() {
arr := [...]int{0,1,2,3,4,5,6,7}
fmt.Println(arr[2:6]) //[2 3 4 5]
fmt.Println(arr[:6]) //[0 1 2 3 4 5]
fmt.Println(arr[2:]) //[2 3 4 5 6 7]
fmt.Println(arr[:]) //[0 1 2 3 4 5 6 7]
}

(2)slice的扩展

slice可以向后扩展,不可以向前扩展

package main

import "fmt"

func main() {
arr := [...]int{0,1,2,3,4,5,6,7}
s1 := arr[2:6]
s2 := s1[3:5]
fmt.Println(s1) //[2 3 4 5]
fmt.Println(s2) //[5 6]
}

 s2是如何取到[5,6]的

 

(3)slice的实现

slice底层隐藏了三个值

s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)

package main

import "fmt"

func main() {
arr := [...]int{0,1,2,3,4,5,6,7}
s1 := arr[2:6]
s2 := s1[3:5]
fmt.Println("arr = ",arr) //arr = [0 1 2 3 4 5 6 7]
fmt.Printf("s1=%v,len(s1)=%d,cap(s1)=%d\n",s1,len(s1),cap(s1)) //s1=[2 3 4 5],len(s1)=4,cap(s1)=6
fmt.Printf("s2=%v,len(s2)=%d,cap(s2)=%d\n",s2,len(s2),cap(s2)) //s2=[5 6],len(s2)=2,cap(s2)=3
fmt.Println(s1[3:6]) //[5 6 7]
}

3.3.切片的操作

(1)向slice添加元素

  • 添加元素时,如果超出了cap,系统会重新分配更大的底层数组
  • 由于值传递的关系,必须接收append的返回值。s = append(s,val)
package main

import "fmt"

func main() {
arr := [...]int{0,1,2,3,4,5,6,7}
s1 := arr[2:6] //[2 3 4 5]
s2 := s1[3:5] //[5 6]
s3 := append(s2,10)
s4 := append(s3,11)
s5 := append(s4,12)
fmt.Println(s3,s4,s5) //[5 6 10] [5 6 10 11] [5 6 10 11 12]
//因为s2的cap是[5,6,7],s3 append把7替换成10,s4后超出了cap
fmt.Println(arr) //[0 1 2 3 4 5 6 10]
}

(2)slice的创建

package main

import "fmt"

func main() {
//第一种
//Zero value for slice is nil
var s1 []int
fmt.Println(s1) //[] for i := 0; i < 5 ; i++{
s1 = append(s1,i)
}
fmt.Println(s1) //[0 1 2 3 4] //第二种
s2 := []int{2,4,6,8}
fmt.Printf("len(s2)=%d,cap(s2)=%d\n",len(s2),cap(s2)) //len(s2)=4,cap(s2)=4 //第三种
s3 := make([]int,16)
fmt.Printf("len(s3)=%d,cap(s3)=%d\n",len(s3),cap(s3)) //len(s3)=16,cap(s3)=16 //第四种
s4 := make([]int,16,32)
fmt.Printf("len(s4)=%d,cap(s4)=%d\n",len(s4),cap(s4)) //len(s4)=16,cap(s4)=32
}

(3)slice的删除

package main

import "fmt"

func main() {
s1 := []int{0,1,2,3,4,5,6}
fmt.Println(s1) //[0 1 2 3 4 5 6]
//删除index为3的值
s1 = append(s1[:3],s1[4:]...)
fmt.Println(s1) //[0 1 2 4 5 6]
}

3.4.Map  

(1)map的三种建立方式

package main

import "fmt"

func main() {
//第一种
m1 := map[string]string{
"name": "derek",
"course": "go",
"city": "guangdong",
}
fmt.Println(m1) //map[city:guangdong course:go name:derek] //第二种
m2 := make(map[string]int)
fmt.Println(m2) //map[] //第三种
var m3 map[string]string
fmt.Println(m3) //map[]
}

(2)map的遍历

package main

import "fmt"

func main() {
m1 := map[string]string{
"name": "derek",
"course": "go",
"city": "guangdong",
}
fmt.Println(m1) //map[city:guangdong course:go name:derek] for k,v := range m1{
fmt.Println(k,v)
}
} //结果
name derek
course go
city guangdong

(3)值的获取

key存在获取,不存在则得到空值

package main

import "fmt"

func main() {
m1 := map[string]string{
"name": "derek",
"course": "go",
"city": "guangdong",
}
fmt.Println(m1) //map[city:guangdong course:go name:derek] //获取map中key的value
courseName := m1["course"]
fmt.Println(courseName) //go //如果key不存在,不会报错,而是得到一个空值
age := m1["age"]
fmt.Println(age) //空值
}

(4)用if判断取值

package main

import "fmt"

func main() {
m1 := map[string]string{
"name": "derek",
"course": "go",
"city": "guangdong",
}
fmt.Println(m1) //map[city:guangdong course:go name:derek] //key存在,ok = true
courseName,ok := m1["course"]
fmt.Println(courseName, ok) //go true //key不存在,ok = false
age, ok := m1["age"] // ok = false
fmt.Println(age,ok) //取值的时候加一个判断,ok=true取值,否则打印值不存在
if age, ok := m1["age"]; ok{
fmt.Println(age)
}else {
fmt.Println("key does not exist")
}
}

(5)删除key

package main

import "fmt"

func main() {
m1 := map[string]string{
"name": "derek",
"course": "go",
"city": "guangdong",
}
fmt.Println(m1) //map[city:guangdong course:go name:derek] //删除key
delete(m1,"city")
fmt.Println(m1) //map[course:go name:derek] }

  

第三章、Go-内建容器的更多相关文章

  1. OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)

    OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...

  2. go内建容器-Map

    1.基础定义 golang中的map如同它的函数一样"纯粹",map就是用来存储键值对的容器,别管什么哈希不哈希的(底层已实现),用就行 //创建一个map m := map[st ...

  3. go内建容器-切片

    1.基础定义 看到'切片'二字,满脸懵逼.切的啥?用的什么刀法切?得到的切片有什么特点?可以对切片进行什么操作? 先看怎么得到切片,也就是前两个问题.切片的底层是数组,所以切片切的是数组:切的时候采用 ...

  4. go内建容器-数组

    1.基础定义 声明时数组长度在数组成员类型前 语法:var variableName [length]int //基本定义 var array1 [3]int //定义并赋值 var array2 = ...

  5. 第三章JavaScript 内置对象

    1 Number 1.1 属性 MAX_VALUE JS可以表示的最大的数字 MIN_VALUE JS可以表示的最小的数字 1.2 方法 toFixed(length) 指定保留长度的小数 toExp ...

  6. go内建容器-字符和字符串操作

    1.基础定义 在基础语法篇提到过golang的rune相当于其他编程语言的char,其本质是一个int32(四字节),用[]rune来转换一个字符串时,得到的是个解码后的结果,存储在新开辟的[]run ...

  7. golang内建容器

  8. 跟着老猫来搞GO-内建容器Map

    前期回顾 在上面的文章中,老猫和大家分享了GO语言中比较重要的两种数据结构,一种是数组,另外一种是基于数组的slice.本篇文章想要继续和大家分享剩下的容器以及字符字符串的处理. MAP map的定义 ...

  9. 18第一章 ASP.Net内建对象

    第一章        ASP.Net内建对象 第一章        ASP.Net内建对象 ASP.Net为保持用户的数据和信息,内建了许多对象,包括Application.Response.Requ ...

随机推荐

  1. spring 5.x 系列第20篇 ——spring简单邮件、附件邮件、内嵌资源邮件、模板邮件发送 (代码配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 邮件发送配置类为com.heibaiyin ...

  2. 使用git提交时报错:error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large

    Delta compression using up to 4 threads.Compressing objects: 100% (2364/2364), done.Writing objects: ...

  3. .net core 杂记:WebAPI的XML请求和响应

    一般情况下,restfult api  进行数据返回或模型绑定,默认json格式会比较常见和方便,当然偶尔也会需要以XML格式的要求 对于返回XML,普通常见的方式就是在每个aciton方法进行诸如X ...

  4. Python笔记【7】_反射getattr&hasattr&setattr&delattr

    Lesson0402_GetatrrWebsite.py #!/usr/bin/env/python #-*-coding:utf-8-*- #Author:LingChongShi #查看源码Ctr ...

  5. 网络IO-阻塞、非阻塞、IO复用、异步

    网络socket输入操作分为两个阶段:等待网络数据到达和将到达内核的数据复制到应用进程缓冲区.对这两个阶段不同的处理方式将网络IO分为不同的模型:IO阻塞模型.非阻塞模型.多路复用和异步IO. 一 阻 ...

  6. POJ 3680:Intervals(最小费用最大流)***

    http://poj.org/problem?id=3680 题意:给出n个区间[Li,Ri],每个区间有一个权值wi,要使得每个点都不被超过k个区间覆盖(最多能被k个区间覆盖),如果选取了第i个区间 ...

  7. JcApiHelper 简单好用的.Net ApiHelper

    一 背景 随着前端技术的不断发展,各种框架逐渐成熟,前端 Angular,React,Vue 三分天下.再加上移动端的崛起,前后端分离开发成为主流,前端后端代码混合开发的方式沦为被淘汰的局面.如今 M ...

  8. flink dataset api使用及原理

    随着大数据技术在各行各业的广泛应用,要求能对海量数据进行实时处理的需求越来越多,同时数据处理的业务逻辑也越来越复杂,传统的批处理方式和早期的流式处理框架也越来越难以在延迟性.吞吐量.容错能力以及使用便 ...

  9. Impala集成C3P0的连接方式

    1. 概述 Impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据.已有的Hive系统虽然也提供了SQL语义,但由于 ...

  10. mysql中id值被重置的情况

    MySQL中,如果你为一张使用了innodb引擎的表指定了一auto_increment列,那么这张表会有一个auto_increment计数器,专门记录当前auto_increment的相关值,用来 ...