Go学习笔记06-内建容器

Go语言

数组

定义数组:

  1. //这样定义数组编译器自动初始化每个元素为0 

  2. var arr1 [5]int 


  3. //这样定义数组需要手动初始化数组 

  4. arr2 := [3]int{1, 3, 5} 


  5. //这样可以让编译器自动计算数组长度 

  6. arr3 := [...]int{2, 4, 6, 8, 10} 


  7. //定义二维数组 

  8. var grid [4][5]bool 

·数量写在类型前面

遍历数组可用 for 循环语句,如:

  1. //用len()函数获取数组长度 

  2. for i := 0;i < len(arr3); i++{ 

  3. fmt.Println(arr3[i]) 

  4. } 

可以用range关键字获取数组的下标和值

  1. //用 range 关键字获取数组的下标和值 

  2. for i, v := range arr3{ 

  3. //i为数组下标,v为值 

  4. fmt.Println(i, v) 

  5. } 


  6. //只获取数值,下标值用 _ 代替 

  7. for _, v := range arr3{ 

  8. fmt.Println(v) 

  9. } 

Go语言中数组是值类型

  • [10]int和[20]int被视为不同的类型
  • 函数调用时会拷贝数组
  • Go语言中一般不直接使用数组

*切片(Slice)

定义一个数组 arr := […]int{0, 1, 2, 3, 4, 5, 6, 7}

那么 s := arr[2:6]就叫做数组arr的一个切片,其值为[2, 3, 4, 5]。

  1. arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} 


  2. //获取数组arr下标从2~5的元素,不包括下标为6的元素 

  3. fmt.Println("arr[2:6] =", arr[2:6]) 

  4. //获取从第一个元素到下标为5的元素 

  5. fmt.Println("arr[:6] =", arr[:6]) 

  6. //获取从下标为2的元素及其后所有的元素 

  7. fmt.Println("arr[2:] =", arr[2:]) 

  8. //获取整个数组的元素 

  9. fmt.Println("arr[:] =", arr[:]) 

slice即切片不是值类型,切片是底层数组的一个视图(view),对切片做的变更会影响到原数组。

切片可以再对其进行reslice操作。

切片的扩展



Slice的操作

Slice添加元素

  1. arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} 

  2. //s1 = [2, 3, 4, 5] 

  3. s1 := arr[2:6] 

  4. //s2 = [5, 6] 

  5. s2 := s1[3:5] 

  6. //s3 = [5, 6, 10] 

  7. s3 := append(s2, 10) 

  8. //s4 = [5, 6, 10, 11] 

  9. s4 := append(s3, 11) 

  10. //s5 = [5, 6, 10, 11, 12] 

  11. s5 := append(s4, 12) 


  12. //s4, s5是不同的数组的视图 

  • 添加元素时如果超越cap,系统会重新分配一个更大的底层数组
  • 由于是值传递,必须接收append的返回值

创建Slice

  1. //未初始化的Slice缺省值是 nil 

  2. var s []int 


  3. //用make创建Slice,slice长度为6 

  4. s2 := make([]int, 6) 

  5. //用make创建Slice,slice长度为10,底层数组长度为32 

  6. s3 := make([]int, 10, 32) 

复制Slice

  1. //复制s1,并存储到s2中 

  2. copy(s2, s1) 

Map

创建map

  1. //创建map,m := map[Key_Type]Value_Type 

  2. m := map[string]string{ 

  3. "name": "Bob", 

  4. "course": "golang", 

  5. "site": "imooc", 

  6. "quality": "not bad" 

  7. } 


  8. //用make创建map,缺省值为 empty map 

  9. m2 := make(map[string]int) 


  10. //这样创建map,缺省值为nil 

  11. var m3 := map[string]int 

遍历Map

  1. //map的遍历同数组遍历操作 

  2. for k, v := range m{ 

  3. fmt.Println(k, v) 

  4. } 

获取元素

  1. courseName := m["course"] 


  2. //用此方法可以判断map中是否含有key为cause的值 

  3. if causeName, isOk := m["cause"]; isOk{ 

  4. fmt.Println(causeName) 

  5. }else { 

  6. fmt.Println("Key does not exisit.") 

  7. } 

删除元素

  1. //用delete删除map元素 

  2. delete(m, "name") 

map小结





map示例

题干:寻找最长不含有重复字符的子串的长度

如:abcabcbb -> abc

bbb -> b

pwwkew -> wke

  1. package main 


  2. import "fmt" 


  3. func lengthOfNoneRepeatSubStr(s string) int{ 

  4. last := make(map[byte]int) 

  5. start := 0 

  6. maxLength := 0 


  7. for i, ch := range []byte(s){ 

  8. if lastI, isOk := last[ch]; isOk && lastI >= start { 

  9. start = lastI + 1 

  10. } 

  11. if i - start + 1 > maxLength{ 

  12. maxLength = i - start + 1 

  13. } 

  14. last[ch] = i 

  15. } 


  16. return maxLength 

  17. } 


  18. func main() { 

  19. fmt.Println(lengthOfNoneRepeatSubStr("abcabcbb")) 

  20. fmt.Println(lengthOfNoneRepeatSubStr("kkkkkkkkk")) 

  21. fmt.Println(lengthOfNoneRepeatSubStr("pwwkew")) 

  22. fmt.Println(lengthOfNoneRepeatSubStr("0123456789")) 

  23. } 

字符处理

在Go语言中,rune相当于char类型

  1. package main 


  2. import "fmt" 


  3. func main(){ 

  4. s := "Yes青青子衿悠悠我心" 

  5. for _, b := range []byte(s){ 

  6. fmt.Printf("%X ", b) 

  7. } 


  8. for i, ch := range s{ 

  9. fmt.Printf("(%d, %X) ", i, ch) 

  10. } 


  11. fmt.Println() 

  12. } 

  • 使用utf8.RuneCountInString获取字符数量
  • 使用len获取字节长度
  • 使用[]byte获取字节

寻找最长不含有重复字符的子串的长度支持中文字符版本

  1. package main 


  2. import "fmt" 


  3. func lengthOfNoneRepeatSubStr(s string) int{ 

  4. last := make(map[rune]int) 

  5. start := 0 

  6. maxLength := 0 


  7. for i, ch := range []rune(s){ 

  8. if lastI, isOk := last[ch]; isOk && lastI >= start { 

  9. start = lastI + 1 

  10. } 

  11. if i - start + 1 > maxLength{ 

  12. maxLength = i - start + 1 

  13. } 

  14. last[ch] = i 

  15. } 


  16. return maxLength 

  17. } 


  18. func main() { 

  19. fmt.Println(lengthOfNoneRepeatSubStr("abcabcbb")) 

  20. fmt.Println(lengthOfNoneRepeatSubStr("kkkkkkkkk")) 

  21. fmt.Println(lengthOfNoneRepeatSubStr("pwwkew")) 

  22. fmt.Println(lengthOfNoneRepeatSubStr("0123456789")) 

  23. } 

有关字符的操作在包 strings 中。

Go学习笔记06-内建容器的更多相关文章

  1. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记

    机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习作者:米仓山下时间: ...

  2. Flutter学习笔记(10)--容器组件、图片组件

    如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 上一篇Flutter学习笔记(9)--组件Widget我们说到了在Flutter中一个非常重要的理念"一切皆为组件 ...

  3. iOS学习笔记06—Category和Extension

    iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inher ...

  4. [Golang学习笔记] 06 程序实体3 类型断言和类型转换

    类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...

  5. C++学习笔记之——内联函数,引用

    本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 作者:晨凫 ...

  6. stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)

    STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启 ...

  7. [原创]java WEB学习笔记06:ServletContext接口

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. Bash脚本编程学习笔记06:条件结构体

    简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...

  9. Docker 与 K8S学习笔记(二)—— 容器核心知识梳理

    本篇主要对容器相关核心知识进行梳理,通过本篇的学习,我们可以对容器相关的概念有一个全面的了解,这样有利于后面的学习. 一.什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在 ...

  10. laravel 学习笔记 — 神奇的服务容器

     2015-05-05 14:24 来自于分类 笔记 Laravel PHP开发 竟然有人认为我是抄 Laravel 学院的,心塞.世界观已崩塌. 容器,字面上理解就是装东西的东西.常见的变量.对象属 ...

随机推荐

  1. 【微服务No.1】Consul服务发现在windows下简单使用

    基本介绍: 安装: 下载地址:https://www.consul.io/downloads.html 运行: consul agent -dev 显示这个界面说明已经开启成功. 页面显示: 然后访问 ...

  2. [Linux] LVS虚拟服务器四层负载均衡

    随着互联网的爆炸性增长及其在我们生活中日益重要的作用,互联网上的流量急剧增加,并且每年以超过100%的速度增长.服务器上的工作负载正在迅速增加,因此服务器很容易在短时间内过载,尤其是对于流行的网站.为 ...

  3. Ubuntu 安装 chrome

    依次执行命令: sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ wget - ...

  4. JS使用cookie实现只出现一次的广告代码效果

    我们上网经常会遇到第一次需要登录而之后不用再登录的网站的情况,其实是运用了Cookie 存储 web 页面的用户信息,Cookie 以名/值对形式存储,当浏览器从服务器上请求 web 页面时, 属于该 ...

  5. 用webpack2.0构建vue2.0超详细精简版

    初始化环境 npm init -y 初始化项目 安装各种依赖项 npm install --save vue 安装vue2.0 npm install --save-dev webpack@^2.1. ...

  6. js判断当前内容是否为空

    function isValue(o) { return (this.isObject(o) || this.isString(o) || this.isNumber(o) || this.isBoo ...

  7. https协议为什么比http协议更加安全

    一.http协议 http协议是一种网络传输协议,规定了浏览器和服务器之间的通信方式.位于网络模型中的应用层.(盗图小灰.ヾ(◍°∇°◍)ノ゙) 但是,它的信息传输全部是以明文方式,不够安全,很容易被 ...

  8. Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较

    本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring  AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一 ...

  9. 转载------35岁开始转变的观念(干了这碗鸡汤再写代码保证没有bug)

    作为一个标准的IT男,从一开始的一线开发,做到管理层,又因为喜爱开发,跳槽继续专注coding,一干就是10多年.有时候就想,这样一直学习,coding,如果能干到老也挺不错的! 不过生活的压力是不会 ...

  10. Git .gitignore文件简介及使用

    Git .gitignore文件简介及使用 By:授客 QQ:1033553122 .gitignore 这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中.实际项目中,很多文件都是不需要版本 ...