go语言中的slice

package main;

import "fmt"

func main() {
	//slice本身不是数组,指向底层的数组
	//作为变长数组的替换方案
	//slice是引用类型

	//声明一个slice,这里不需要指定长度
	var a []int;

	//创建一个数组
	var b = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

	//通过数组来创建slice
	c := b[1:len(b)];
	//同上,简写
	d := b[1:];
	//从下标2开始,到4结束,不包括下标4的元素
	e := b[2:4];
	//从数组开始,取3个
	f := b[:3];

	//通过make创建slice
	//长度为3,容量为10的slice
	g := make([]int, 3, 10);

	h := []byte{‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘};
	i := h[2:5];
	//注意这里的索引是相对i的索引,i现在是[‘c‘, ‘d‘, ‘e‘]
	j := i[1:3];
	//注意这里6已经超过了i的cap容量,会报错
	//j := i[1:6];

	//在slice的尾部追加元素
	k := make([]int, 3, 6);
	fmt.Printf("%p %v\n", &k, k);
	k = append(k, 1, 2, 3);
	fmt.Printf("%p %v\n", &k, k);
	//这里当追加的元素超过了slice的cap时,会重新分配地址,并把值拷贝
	k = append(k, 4, 5, 6);
	fmt.Printf("%p %v\n", &k, k);

	//slice是引用类型,修改某一个slice的值,其他也相应改变
	m := []int{1, 2, 3, 4, 5};
	l := m[2:5];
	n := m[1:4];
	fmt.Println(m, l, n);
	//改变l中的值,m,n中也相应改变
	l[0] = 6;
	fmt.Println(m, l, n);

	//如果当slice发生地址重新分配后,那相应改变是不生效的
	o := []int{1, 2, 3, 4, 5};
	p := o[2:5];
	q := o[1:4];
	fmt.Println(o, p, q);
	//在改变p元素值之前,我们让q发生地址重新分配
	q = append(q, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
	//再改变p的值,这时q的值不会发生改变,因为它已经指向新的地址
	p[0] = 6;
	fmt.Println(o, p, q);

	//copy时以长度短的为准
	r := []int{1, 2, 3, 4, 5};
	s := []int{6, 7, 8};
	//这里只会把s中的6,7,8拷贝到r中的1,2,3
	copy(r, s);
	fmt.Println(r, s);

	fmt.Println(a);
	fmt.Println(b);
	fmt.Println(c);
	fmt.Println(d);
	fmt.Println(e);
	fmt.Println(f);
	fmt.Println(g, len(g), cap(g));
	fmt.Println(string(h));
	fmt.Println(string(i), cap(i));
	fmt.Println(string(j), cap(j));
}

  

时间: 2024-10-14 04:14:48

go语言中的slice的相关文章

[转]理解Go语言中的nil

最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例都是来自于视频. nil是什么 相信写过Golang的程序员对下面一段代码是非常非常熟悉的了: if err != nil { // do something.... } 当出现不等于nil的时候,说明出现某些错误了,需要我们对这个错误进行一些处理,而如果等于nil说明运行正常.那什么是nil呢?查一下词典可以知道,nil的意思是无,或者是零值.零值,zero value,是不是有点

在Swift语言中,关于Any,AnyObject,AnyClass的区别与联系

在Swift语言中,协议定义类或结构体应该遵守的变量和方法集合,如下所示,这个一个标准的协议的声明: protocol NSObjectProtocol { func isEqual(object: AnyObject?) -> Bool var hash: Int { get } var superclass: AnyClass? { get } func `self`() -> Self! func isProxy() -> Bool func isKindOfClass(aClas

GO语言中import的规则和用法

GO语言中引入包使用import,我将在本文讲解下规则和用法. 一些规则: 1.包中不能有main方法. 2.同文件夹中可以直接用方法名调用. 3.main函数建议放在package main里4.main不能调用同个目录下的其它文件中的方法. 5.还可以把包放在上级的目录中,如: /src/myFolder/foo/bar1.go #package foo /src/myFolder/foo/bar2.go #package foo /src/myFolder/foo/bar3.go #pac

Java语言中String累的总结

String类 1.Java.lang包简介 java.lang包是java内置的一个基础包,其中包含了一系列程序中经常要用到的类: 在默认情况下,每个java程序都会自动导入该包,因此无需在程序中显式地声明. 2.String类 Java语言中,字符串是String类的对象: Java语言中,String是引用数据类型: 可以通过使用String类提供的方法来完成对字符串的操作: 创建一个字符串对象之后,将不能更改构成字符串的字符: 每当更改了字符串版本时,就创建了一个新的字符串对象,并在其内

C语言中,头文件和源文件的关系(转)

简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件)4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息.(生成.exe文件) 编译器在编译时是以C文件为单位进行的,也就是

C语言中,定义的含义?声明的含义?它们之间的区别是什么?

在C语言中,对于定义和声明,也许我们非常的熟悉,但不一定真正的了解! 定义的含义:所谓定义,就是创建(编译器)一个对象,为这个对象分配一块内存空间并取名,也就是我们平常所说的变量名或对象名,一旦这个名字和这块内存空间匹配,那么在定义的这个对象或变量的生命周期中,所创建的这个变量名将不能再被改变,并且内存空间的位置也不会改变.在一个区域内(函数内,全局),一个名字只能被定义一次,不能重复定义. 声明的含义:声明有两重含义 第一重含义:告诉编译器,这个名字已经匹配到了一块内存空间上,后面的代码所用到

黑马程序员---C语言中的extern

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”. 1. extern修饰变量的声明.举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v.这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a.c中

转:C语言中的static变量和C++静态数据成员(static member)

转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量        a.静态局部变量在函数内定义,生存期为整个程序运行期间,但作用域与自动变量相同,只能在定义该变量的函数内使用.退出该函数后, 尽管该变量还继续存在,但不能使用它.        b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值.而对自动变量不赋初值,则其值是不定的.2).static全局变量        全局变量本身就是静

Swift语言中 String 的一些操作方法

整理自慕课网liuyubobobo老师在<玩儿转Swift>课程中的讲解,在此表示感谢!同时推荐这套视频课程http://www.imooc.com/learn/127 var str = "Welcome to Play Swift! Step by step to learn Swift." // Range的用法和相关字符串的操作代码片段  str.rangeOfString(“Step”)  // 字符串片段“Step”所处的字符范围 23..<27, 也即第