Go:复合数据类型

此生再无相见时 提交于 2020-02-28 21:27:51

1、数组

  • 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。

  • Go语言中很少直接使用数组。和数组对应的类型是Slice(切片),它是可以增长和收缩动态序列,slice功能也更灵活。

  • 内置的len函数将返回数组中元素的个数

  • 默认情况下,数组的每个元素都被初始化为元素类型 对应的零值

  • 如果在数组的长度位置出现的是“…”省略号,则表示数组的长度是根据初始化值的个数来计算,,比如:

    q := [...]int{1, 2, 3}         //[3]int
    
  • 可以直接通过==比较运算符来比较两个数组,只有当两个数组的所有元素都是相等的时候数组才是相等的。

关于函数入参:
当调用一个函数的时候,函数的每个调用参数将会被赋值给函数内部的参数变量,所以函数参数变量接收的是 一个复制的副本,并不是原始调用的变量。因为函数参数传递的机制导致传递大的数组类型是低效的,并且对数组参数的任何的修改都是发生在复制的数组上,并不能直接修改调用时原始的数组变量。

当然,我们可以显式地传入一个数组指针,那样的话函数通过指针对数组的任何修改都可以直接反馈到调用者。

关于函数入参是值传递还是引用传递可参考:飞雪无情

2、Slice

概念

  • Slice(切片)代表变长的序列,序列中每个元素都有相同的类型。
  • 一个slice类型一般写作[]T,其中T代表slice中元素的类型。
  • slice的语法和数组很像,只是没有固定长度而已。
  • slice之间不能使用==操作符来判断两个slice是否含有全部相等元素,原因如下:
    在这里插入图片描述
  • 要测试一个slice是否是空的,使用len(s) == 0来判断,而不应该用s == nil来判断

函数

  • 内置的lencap函数分别返回slice的长度容量

  • slice的切片操作s[i:j],其中0 ≤ i≤ j≤ cap(s),用于创建一个新的slice,引用s的从第i个元素开始到第j-1个元素的子序列。

  • s[i:] 表示 第i个元素到最后一个元素,s[:j] 表示第0个元素到第j-1个元素。s[:] 切片操作则是引用整个数组。

  • 因为slice值包含指向第一个slice元素的指针,因此向函数传递slice将允许在函数内部修改底层数组的元素,换句话说,复制一个slice只是对底层的数组创建了一个新的slice别名

  • 在底层,make函数 创建了一个匿名的数组变量,然后返回一个slice;只有通过返回的slice才能引用底层匿名的数组变量

    	make([]T, len)
    	make([]T, len, cap) // same as make([]T, cap)[:len]
    
  • append函数 用于向slice追加元素,当slice的容量不足的时候,会通过扩容的方式生成一个新的slice ,所以不能确认在原先的slice上的操作是否会影响到新的slice。因此,通常是将append返回的结果 直接 赋值输入的slice变量

Slice内存技巧

  • 直接覆盖原有数组的方式: out = append(out, s)
  • 用Slice模拟一个stack
    1、初始化stack
    	stack = append(stack, v) // push v
    
    2、stack的顶部位置对应slice的最后一个元素:
    	top := stack[len(stack)-1] // top of stack
    
    3、通过收缩stack可以弹出栈顶的元素
    	stack = stack[:len(stack)-1] // pop
    
    4、要删除slice中间的某个元素并保存原有的元素顺序,可以通过内置的copy函数将后面的子slice向前依次移动一位完成:
    	func remove(slice []int, i int) []int {
    		copy(slice[i:], slice[i+1:])
    		return slice[:len(slice)-1]
    	}
    
    如果删除元素后不用保持原来顺序的话,我们可以简单的用最后一个元素覆盖被删除的元素

3、Map

在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应key和value。其中K对应的key必须支持==比较运算符的数据类型,所以map可以通过测试key是否相等来判断是否已经存在。

1、创建map

内置的make函数可以创建一个map:

	ages := make(map[string]int) // mapping from strings to ints

用map字面值的语法创建map:

	ages := map[string]int{
		"alice": 31,
		"charlie": 34,
	}

2、访问

3、删除

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!