Go学习笔记06-内建容器
Go学习笔记06-内建容器
数组
定义数组:
- //这样定义数组编译器自动初始化每个元素为0
- var arr1 [5]int
- //这样定义数组需要手动初始化数组
- arr2 := [3]int{1, 3, 5}
- //这样可以让编译器自动计算数组长度
- arr3 := [...]int{2, 4, 6, 8, 10}
- //定义二维数组
- var grid [4][5]bool
·数量写在类型前面
遍历数组可用 for 循环语句,如:
- //用len()函数获取数组长度
- for i := 0;i < len(arr3); i++{
- fmt.Println(arr3[i])
- }
可以用range关键字获取数组的下标和值
- //用 range 关键字获取数组的下标和值
- for i, v := range arr3{
- //i为数组下标,v为值
- fmt.Println(i, v)
- }
- //只获取数值,下标值用 _ 代替
- for _, v := range arr3{
- fmt.Println(v)
- }
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]。
- arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
- //获取数组arr下标从2~5的元素,不包括下标为6的元素
- fmt.Println("arr[2:6] =", arr[2:6])
- //获取从第一个元素到下标为5的元素
- fmt.Println("arr[:6] =", arr[:6])
- //获取从下标为2的元素及其后所有的元素
- fmt.Println("arr[2:] =", arr[2:])
- //获取整个数组的元素
- fmt.Println("arr[:] =", arr[:])
slice即切片不是值类型,切片是底层数组的一个视图(view),对切片做的变更会影响到原数组。
切片可以再对其进行reslice操作。
切片的扩展


Slice的操作
Slice添加元素
- arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
- //s1 = [2, 3, 4, 5]
- s1 := arr[2:6]
- //s2 = [5, 6]
- s2 := s1[3:5]
- //s3 = [5, 6, 10]
- s3 := append(s2, 10)
- //s4 = [5, 6, 10, 11]
- s4 := append(s3, 11)
- //s5 = [5, 6, 10, 11, 12]
- s5 := append(s4, 12)
- //s4, s5是不同的数组的视图
- 添加元素时如果超越cap,系统会重新分配一个更大的底层数组
- 由于是值传递,必须接收append的返回值
创建Slice
- //未初始化的Slice缺省值是 nil
- var s []int
- //用make创建Slice,slice长度为6
- s2 := make([]int, 6)
- //用make创建Slice,slice长度为10,底层数组长度为32
- s3 := make([]int, 10, 32)
复制Slice
- //复制s1,并存储到s2中
- copy(s2, s1)
Map
创建map
- //创建map,m := map[Key_Type]Value_Type
- m := map[string]string{
- "name": "Bob",
- "course": "golang",
- "site": "imooc",
- "quality": "not bad"
- }
- //用make创建map,缺省值为 empty map
- m2 := make(map[string]int)
- //这样创建map,缺省值为nil
- var m3 := map[string]int
遍历Map
- //map的遍历同数组遍历操作
- for k, v := range m{
- fmt.Println(k, v)
- }
获取元素
- courseName := m["course"]
- //用此方法可以判断map中是否含有key为cause的值
- if causeName, isOk := m["cause"]; isOk{
- fmt.Println(causeName)
- }else {
- fmt.Println("Key does not exisit.")
- }
删除元素
- //用delete删除map元素
- delete(m, "name")
map小结



map示例
题干:寻找最长不含有重复字符的子串的长度
如:abcabcbb -> abc
bbb -> b
pwwkew -> wke
- package main
- import "fmt"
- func lengthOfNoneRepeatSubStr(s string) int{
- last := make(map[byte]int)
- start := 0
- maxLength := 0
- for i, ch := range []byte(s){
- if lastI, isOk := last[ch]; isOk && lastI >= start {
- start = lastI + 1
- }
- if i - start + 1 > maxLength{
- maxLength = i - start + 1
- }
- last[ch] = i
- }
- return maxLength
- }
- func main() {
- fmt.Println(lengthOfNoneRepeatSubStr("abcabcbb"))
- fmt.Println(lengthOfNoneRepeatSubStr("kkkkkkkkk"))
- fmt.Println(lengthOfNoneRepeatSubStr("pwwkew"))
- fmt.Println(lengthOfNoneRepeatSubStr("0123456789"))
- }
字符处理
在Go语言中,rune相当于char类型
- package main
- import "fmt"
- func main(){
- s := "Yes青青子衿悠悠我心"
- for _, b := range []byte(s){
- fmt.Printf("%X ", b)
- }
- for i, ch := range s{
- fmt.Printf("(%d, %X) ", i, ch)
- }
- fmt.Println()
- }
- 使用utf8.RuneCountInString获取字符数量
- 使用len获取字节长度
- 使用[]byte获取字节
寻找最长不含有重复字符的子串的长度支持中文字符版本
- package main
- import "fmt"
- func lengthOfNoneRepeatSubStr(s string) int{
- last := make(map[rune]int)
- start := 0
- maxLength := 0
- for i, ch := range []rune(s){
- if lastI, isOk := last[ch]; isOk && lastI >= start {
- start = lastI + 1
- }
- if i - start + 1 > maxLength{
- maxLength = i - start + 1
- }
- last[ch] = i
- }
- return maxLength
- }
- func main() {
- fmt.Println(lengthOfNoneRepeatSubStr("abcabcbb"))
- fmt.Println(lengthOfNoneRepeatSubStr("kkkkkkkkk"))
- fmt.Println(lengthOfNoneRepeatSubStr("pwwkew"))
- fmt.Println(lengthOfNoneRepeatSubStr("0123456789"))
- }
有关字符的操作在包 strings 中。
Go学习笔记06-内建容器的更多相关文章
- 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记
机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习作者:米仓山下时间: ...
- Flutter学习笔记(10)--容器组件、图片组件
如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 上一篇Flutter学习笔记(9)--组件Widget我们说到了在Flutter中一个非常重要的理念"一切皆为组件 ...
- iOS学习笔记06—Category和Extension
iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inher ...
- [Golang学习笔记] 06 程序实体3 类型断言和类型转换
类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...
- C++学习笔记之——内联函数,引用
本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 作者:晨凫 ...
- stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)
STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启 ...
- [原创]java WEB学习笔记06:ServletContext接口
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Bash脚本编程学习笔记06:条件结构体
简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...
- Docker 与 K8S学习笔记(二)—— 容器核心知识梳理
本篇主要对容器相关核心知识进行梳理,通过本篇的学习,我们可以对容器相关的概念有一个全面的了解,这样有利于后面的学习. 一.什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在 ...
- laravel 学习笔记 — 神奇的服务容器
2015-05-05 14:24 来自于分类 笔记 Laravel PHP开发 竟然有人认为我是抄 Laravel 学院的,心塞.世界观已崩塌. 容器,字面上理解就是装东西的东西.常见的变量.对象属 ...
随机推荐
- .Net 登陆的时候添加验证码
一.ASPX 登陆界面验证码 1.登陆验证码图片和输入验证码框 <asp:TextBox ID="txtValiCode" runat="server" ...
- 对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章,通过文氏图 Venn diagrams 解释了SQL的Join。我觉得清楚易懂,转过来。
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codi ...
- Xhprof graphviz Warning: proc_open() [function.proc-open]: CreateProcess failed, error code 解决方法
Xhprof在windows下点击[View Full Callgraph]调用graphviz软件时.警告Warning: proc_open() [function.proc-open]: Cre ...
- Netty 系列四(ChannelHandler 和 ChannelPipeline).
一.概念 先来整体的介绍一下这篇博文要介绍的几个概念(Channel.ChannelHandler.ChannelPipeline.ChannelHandlerContext.ChannelPromi ...
- Elasticsearch系列(2):安装Elasticsearch(Linux环境)
系统环境 操作系统:CentOS 6.9 Elasticsearch:6.2.2 Filebeat:6.2.2(收集IIS日志) Kibana:6.2.2 Java:Java 8 注意:elk最好选择 ...
- 玩游戏 学Flex布局
大家好,今天推荐一个学习Flex布局的网页小游戏,非常不错,是国外的牛人开发的,值得一试,重复几次,就会大概了解Flex的属性了! 地址: http://flexboxfroggy.com/#zh-c ...
- CA 工作流程
散列函数 Hash 常见的有 MD5, SHA1, SHA256, 该类函数特点是函数单向不可逆,对输入非常敏感,输出长度固定,针对数据的任何修改都会改变散列函数的结果,用于防止信息篡改并验证数据的完 ...
- es6 语法 (函数扩展)
//函数参数默认值(more值后不能有参数) { function test(x,y = 'world'){ console.log('默认值',x,y); } test('hello');// he ...
- [HTML/CSS]下拉菜单
原理:先让下拉菜单隐藏,鼠标移到的时候在显示出来 1>display 无动画效果,图片是秒出 2>opacity 有动画效果,我这里是1S出现,推荐配合绝对定位使用
- docker研究-2
容器和虚拟机都是一种虚拟化技术,两者的主要区别: 虚拟机占用资源多,启动慢,荣誉步骤多:而容器启动快,占用资源少,体积小.Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口.它 ...