一、内置函数

  • append :追加元素到slice里,返回修改后的slice
  • close :关闭channel
  • delete :从map中删除key对应的value
  • panic  : 用于异常处理,停止常规的goroutine
  • recover :用于异常处理,允许程序定义goroutine的panic动作
  • imag :返回复数(complex)的实部
  • real  : 返回复数(complex)的虚部
  • make :用来分配内存,主要分配引用类型,返回Type本身(只能应用于slice, map, channel)
  • new :分配内存,主要分配值类型,返回指向Type的指针,如int
  • cap  :容量,容积capacity
  • copy :复制slice,返回复制的数目
  • len :返回长度

二、数组与切片

概念:同一组数据类型的固定长度的序列

注意:

  • 长度数数组类型的一部分,因此var a[2] int 和 var a[3] int是不同的类型
  • 数组索引是从0开始(python相同),访问超过了索引会panic
  • 数组定义完成之后,每个位置会有默认值,int类型,默认值为0,string类型默认为空字符串
  • 数组属于值类型,当对其进行拷贝并修改副本值时,并不会改变原来的值

定义方法:

//第一种
//var <数组名称> [<数组长度>]<数组元素>
var arr []int
arr[]=
arr[]= //第二种
var a []int
a = make([]int, ) //第三种
//var <数组名称> = [<数组长度>]<数组元素>{元素1,元素2,...}
var arr = []int{,}
//或者
arr := []int{,} //第四种
//var <数组名称> [<数组长度>]<数组元素> = [...]<元素类型>{元素1,元素2,...}
var arr = [...]int{,}
//或者
arr := [...]int{,} //第五种
//var <数组名称> [<数组长度>]<数组元素> = [...]<元素类型>{索引1:元素1,索引2:元素2,...}
var arr = [...]int{:,:}
//或者
arr := [...]int{:,:}

数组遍历

package main

import "fmt"

func main()  {
var arr = [...] int {:,:,:} for i := ; i<len(arr); i++ {
fmt.Println(arr[i])
} }//结果:2,4,8
package main

import "fmt"

func test(a *[] int )  { //传递地址
(*a)[]=
return
} func main() {
var arr [] int
test(&arr) //使用&取地址
fmt.Println(arr[]) }//结果:100

使用函数修改数组元素

package main

import (
"fmt"
) func fab(n int) {
var a []int
a = make([]int, n) a[] =
a[] = for i := ; i < n; i++ {
a[i] = a[i-] + a[i-]
}
for _, v := range a {
fmt.Println(v)
}
} func main() {
fab()
}

斐波那契数列

多维数组

多维数组,相当于多添加了维数

package main

import "fmt"

func main() {
var a [][][] int //三维数组
a[][][]=
a[][][]=
a[][][]=
fmt.Println(a)
}

切片

概念:切片是对数组的引用,数组的长度不便,但是切片长度是可以变化的。

切片的特性和数组一样,因此遍历、长度计算等和数组一样

切片定义和数组的定义方式在于是否有长度定义,有长度定义为数组、没有长度定义为切片

//方式一,使用make创建
slice1 := make([]type, len,capacity) 或者var slice1 []type = make([]type, len,capacity)//其中capacity(容量)为可选参数 //方式二,直接初始化
slice2 :=[] int {,} //长度为2,容量为2 //方式三,从数组中获取切片,与python一样
slice3 := arr[startIndex:endIndex] //将arr数组中从下标startIndex到endIndex-1下的元素创建为一个新的切片
slice4 := arr[startIndex:] //缺省endIndex时将表示一直到arr数组的最后一个元素
slice5 := arr[:endIndex] //缺省startIndex时将表示从arr数组的第一个元素开始

切片操作

len:计算长度(长度是指已经被赋过值的最大下标+1)

cap:求容量(容量是指切片可容纳的最多元素个数)

copy: 拷贝切片

append:向切片中追加元素

注意事项:

使用append向切片追加元素,如果长度没超过定义的切片的长度,返回原来的切片地址,如果超过了长度,切片会扩容进行重新分配地址。

package main

import "fmt"

func main() {
var slice2 [] int = make([] int,,)
fmt.Println(len(slice2),cap(slice2)) }//结果 2,3
package main

import "fmt"

func main() {
var slice1 [] int = make([] int,,)
slice2 :=[] int {,,} fmt.Printf("%p--%d\n",slice1,slice1)
slice1=append(slice1,) //追加单个元素
fmt.Printf("slice1:%p--%d\n",slice1,slice1)
slice3 :=append(slice1,slice2...) //追加另一个切片
fmt.Printf("slice3:%p--%d\n",slice3,slice3)
slice4 := make([] int,len(slice3))
copy(slice4,slice3) //拷贝slice3
fmt.Printf("copy:slice3:%p--%d\n",slice3,slice3)
fmt.Printf("slice4:%p--%d\n",slice4,slice4)
}

空(nil)切片

一个切片在未初始化之前默认为 nil,长度为 0

三、map

概念:map是go语言内置key-value的数据结构,与python的dict类似,可称为字典或关联数组。

map声明与初始化

map属于引用类型,声明是不会分配内存的,需要make初始化分配内存。

//只声明不初始化,直接使用会panic,需要使用make分配内存后方可使用
var a map[keytype]valuetype
var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string  //声明并初始化
var a map[string]string
a = make(map[string]string, 8) //8代表容量 a := make(map[string]string, 8)
a := make(map[string]string) var a map[string]string = map[string]string{}
var a map[string]string =map[string]string{"name":"wd","age":""}

map嵌套

map可以嵌套,类似json格式,声明时候只需要将value改为map,同样使用之前需要初始化每一层的map,示例:

package main

import "fmt"

func main() {
a := make(map[string]map[string]string,) //二层map嵌套,声明外层map并初始化
a["key1"] = make(map[string]string) //初始化第二层map
a["key1"]["key2"] = "a1"
a["key1"]["key3"] = "b1"
a["key1"]["key4"] = "c1"
fmt.Println(a)
}

map操作

增删改查、求长度

mymap["name"] = "wd"   // 创建或者更新
delete(mymap, "name") // 删除
name := mymap["name"] // 查询
len(mymap) // 求长度 //测试key是否存在
package main
import "fmt"
func main() {
a := make(map[string]string,)
a["key1"] = "wd"
val,ok := a["key1"] //ok为true时,代表有key
if ok{
fmt.Println(val)
}else {
fmt.Println("key1 is not exist")
} }

遍历map

package main

import (
"fmt"
) func main() {
a := map[string]string{"NAME":"WD","AGE":""}
for k :=range a{ //使用key进行遍历
fmt.Println(a[k])
}
for k,v :=range a{ //使用key,value进行遍历
fmt.Println(k,v)
}
}

切片嵌套map

package main

import "fmt"

func main() {
a := map[string]string{"NAME":"WD","AGE":""} //初始化map
b := make([]map[string]string,,) //初始化切片
b[]=a
fmt.Println(b)
}

map排序

go语言中的map都是无序的,并且无内置排序方法,所有如果我们想要对map进行排序,我们需要自己实现。

方法:

  • 先获取所有的key,将key进行排序
  • 按照排序好的key进行遍历
package main

import (
"fmt"
"sort"
) func main() {
a:= map[string]string{"":"a","":"b","":"c","":"d"}
var keys [] string
for k := range a{
keys = append(keys, k)
}
sort.Strings(keys)//排序切片key
fmt.Println(keys,len(keys))
for _,val := range keys{ //循环key取值
fmt.Println(a[val])
}
}

go语言之行--数组、切片、map的更多相关文章

  1. go语言中的数组切片:特立独行的可变数组

    go语言中的数组切片:特立独行的可变数组 初看go语言中的slice,觉得是可变数组的一种很不错的实现,直接在语言语法的层面支持,操作方面比起java中的ArrayList方便了许多.但是在使用了一段 ...

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

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

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

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

  4. GO 语言学习笔记--数组切片篇

    1.对于make 数组切片,长度和容量需要理解清楚: 容量表示底层数组的大小,长度是你可以使用的大小: 容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否 ...

  5. go语言学习-数组-切片-map

    数组 go语言中数组的特点: 数组的长度是固定的,并且长度也是数组类型的一部分 是值类型,在赋值或者作为参数传递时,会复制整个数组,而不是指针 定义数组的语法: var arr1 = [5]int{1 ...

  6. golang(4):函数 & 数组 & 切片 & map & 锁

    内置函数 // 1. close:主要用来关闭channel // 2. len:用来求长度,比如string.array.slice.map.channel // 3. new:用来分配内存,主要用 ...

  7. go语言学习(一):数组/切片

    学习区块链之后,发现还要学习加密,接触到的视频是:Go的crypto包,所以开始接触Go.因为和solidity有些相似,但是比solidity简单一些,就开始放松的心态去学习.每天翻着go菜鸟教程, ...

  8. Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

    一:数组的属性 每个数组都有它的属性,可分为:ndim(数组的维度),shape(数组每个维度的大小),size(数组的总大小),dtype(数组数据的类型) 二:数组索引 和python列表一样,N ...

  9. Go语言中的数组与数组切片

    Go中的数组与C的数组一样,只是定义方法不同 c: int a[10][10] Go [10][10]int 定义并初始化 array1 := [5]int{1,2,3,4,5} 变量名 := [in ...

随机推荐

  1. ubuntu 搭建samba共享方案

    1.samba服务安装搭建 sudo apt-get install samba sudo vim /etc/samba/smb.conf workgroup = szsoft 设置用户密码登陆方式s ...

  2. android画板笔锋实现

    前言 在安卓绘图中,path是一个很常用的类,使用它可以实现基本的画线功能,但是自己用path画出来的同一条线段大小是不会改变的.如果做书写类型的软件,当然想要实现更好的逼真的书写效果,在实际书写过程 ...

  3. [Android] 实现简单的相机程序

    好久没写了,有些东西做过都快忘了,赶紧记一下. 现在来实现一个简单的相机程序. 原文地址http://www.cnblogs.com/rossoneri/p/4246134.html 当然需要的话可以 ...

  4. 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)

    机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes) 关键字:朴素贝叶斯.python.源码解析作者:米仓山下时间:2018-10-2 ...

  5. 【Python】定时调度

    from datetime import datetime from apscheduler.schedulers.blocking import BlockingScheduler def tick ...

  6. Array常用方法总结

    一.[常用语法] 1.1.数组的创建var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定 ...

  7. 通过HTTP参数污染绕过WAF拦截 (转)

    上个星期我被邀请组队去参加一个由CSAW组织的CTF夺旗比赛.因为老婆孩子的缘故,我只能挑一个与Web漏洞利用相关的题目,名字叫做”HorceForce”.这道题价值300点.这道题大概的背景是,你拥 ...

  8. HTTP学习---TCP三次握手和四次挥手

    IP协议 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成不同主机的通信,我们需要某种方式来唯一标识一台主机,这个标识,就是著名的IP地址.通 ...

  9. 【9】python关于os模块与os.path的相关操作

    ---恢复内容开始--- #__author:"吉*佳" #date: 2018/10/20 0020 #function: # os模块知识点 import os # 获取平台名 ...

  10. [提权]域内提权神器 MS14-068 完整EXP

     可以让任何域内用户提升为域管理员     c:\python27\python.exe ms14-068.py -u k8test3@k8.local -p k8team!@# -s S-1-5-2 ...