golang中坑的慢慢踩!

golang中的数组是值类型,函数调用是传入的是数组的拷贝,如果想改变数组的值,可考虑使用指针数组,即函数调用时传入数组的地址

golang中的切片是引用类型,但是在函数中使用append给切片追加元素是行不通的,需要使用切片的指针类型才能增加元素

数组的使用:

package main

import (
"fmt"
) func ChangeArr(arr []int) {
arr[] =
} func ChangeArr2(arr *[]int) {
arr[] =
} func main() {
a := []int{, , , , }
PrintArr(a)
ChangeArr(a)
PrintArr(a)
ChangeArr2(&a)
PrintArr(a)
} func PrintArr(arr []int) { fmt.Println("\n打印数组:")
for _, v := range arr {
fmt.Print(v, ",")
}
}

运行结果:

切片的使用:

package main

import (
"fmt"
) func ChangeArr(arr []int) {
arr[] =
arr = append(arr, ) //此处的元素并没有增加到切片
} func ChangeArr2(arr *[]int) {
(*arr)[] = //因为传入的是切片指针,所以所有使用切片的地方都必须是指针类型的切片(这里与数组不同)
*arr = append(*arr, ) //此处的元素添加进了切片
} func main() {
a := []int{, , , , }
PrintArr(a)
ChangeArr(a)
PrintArr(a)
ChangeArr2(&a)
PrintArr(a)
} func PrintArr(arr []int) { fmt.Println("\n打印切片:")
for _, v := range arr {
fmt.Print(v, ",")
}
}

运行结果:

数组的特点:
1、长度固定,无法扩容 (记住)
2、数组是值类型,也就是说在作为参数时,函数体中无法修改传入的数组的值
切片特点:
1、长度不固定、可以追加元素(append),在追加时可能使切片的容量增大
2、切片是引用类型
切片slice的数据结构:一个指向真实array数组地址的指针ptr,slice的长度len和容量cap
当在使用 append 的时候,如果 cap==len 了这个时候就会新开辟一块更大内存,然后把之前的数据复制过去,ptr所指向的地址指向新的内存地址
在实际使用中,我们最好事先预期好一个cap,这样在使用append的时候可以避免反复重新分配内存复制之前的数据,减少不必要的性能消耗。

golang数组与切片的更多相关文章

  1. Golang 数组、切片、映射

    定义数组 var arr1 [5]int //整型类型 fmt.Println(arr1) //[0 0 0 0 0] //赋值 arr1 = [5]int{1, 2, 3, 4, 5} fmt.Pr ...

  2. golang 数组、切片、map

    一.数组(类似python的list) 数组的长度一旦定义了就不能动态增长.并且存储的数据类型必须相同. 创建方法: var 数组名 [长度]数据类型 例如: package main import ...

  3. Golang: 数组和切片

    数组 同其他语言一样,数组是一些相同类型的元素的集合.数组声明 数组的类型为 n[T],其中 n 表示数组中元素的个数,T 表示数组中元素的类型.数组元素的个数 n 也是数组类型的一部分 packag ...

  4. Golang数组和切片的区别

    大纲 数组是固定大小 切片不是动态数组,可以扩容 区别 定义方式不一样 初始化方法不一样 package main import "fmt" func main() { // -- ...

  5. golang学习笔记 ---数组与切片

    数组: golang数组包含的每个数据称为数组元素(element),数组包含的元素个数被称为数组长度(length). golang数组的长度在定义后不可更改,并且在声明时可以是一个常量或常量表达式 ...

  6. golang 数组以及slice切片

    老虞学GoLang笔记-数组和切片   数组 Arrays 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其 ...

  7. 手把手golang教程【二】——数组与切片

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第五篇,这一篇我们将会了解golang中的数组和切片的使用. 数组与切片 golang当中数组和C++中的定义类似, ...

  8. golang笔记——数组与切片

    一.切片的定义 我们可以从数组(go语言中很少直接使用数组)或者切片来初始化一个新的切片,也可以直接通过 make 来初始化一个所有元素为默认零值的切片. //1.通过数组来初始化切片 arr := ...

  9. [Golang学习笔记] 07 数组和切片

    01-06回顾: Go语言开发环境配置, 常用源码文件写法, 程序实体(尤其是变量)及其相关各种概念和编程技巧: 类型推断,变量重声明,可重名变量,类型推断,类型转换,别名类型和潜在类型 数组: 数组 ...

随机推荐

  1. Android 屏幕适应

    基础知识: 屏幕密度: Density-independent pixel (dp):密度无关像素单位(一个相对的值).1dp 的大小相当于一个 160 dpi 屏幕上一个像素的大小. 计算方法:px ...

  2. [Bootstrap-Table] 中的事件用例

    [Bootstrap-Table] 中的事件 -------------------------------------------------- <div class="alert ...

  3. RHEL 7 下内存管理小记

    RHEL 7 下内存管理小记 一.Overview 众所周知,在 Linux 操作系统中有三个目录非常有趣好玩. /dev /run /proc 一个个解释下,/dev 用于对特殊设备(BTW:特殊设 ...

  4. spring-boot打包,引入外部jar包问题

    这是我引入的外部jar包,打包的时候找不到外部jar包路径 弄了好久 在lib下引入外部jar包,运行没问题,但是打包是出现问题了,具体解决办法 再pom中加入如下配置,告诉maven导入本地jar ...

  5. 几种封装javaBean的方法

    开发框架时,经常需要使用java对象(javaBean)的属性来封装程序的数据,封装javaBean的方法有很多,比如反射,内省,以及使用工具类.下面从反射开始介绍. 1.javaBean介绍: 简介 ...

  6. 10分钟教你用Python打造天气机器人+关键字自动回复+定时发送

    01 前言 Hello,各位小伙伴.自上次我们介绍了Python实现天气预报的功能以后,那个小程序还有诸多不完善的地方,今天,我们再次来完善一下我们的小程序.比如我们想给机器人发“天气”等关键字,它就 ...

  7. window.open完美替代window.showModalDialog

    var url = "http//:www.baidu.com/" var name = "百度"; var iWidth = 1100;//弹窗宽度 var ...

  8. SpringDataRedis java.net.UnknownHostException: 127.0.0.1 错误

    找了半天发现原来配置文件中多了一个空格; idea中properties文件的127.0.0.1后面出现了一个空格,编辑器将其变深黄色了

  9. 网络编程-echo服务器

    代码: #coding="utf-8" #name=echo服务器 from socket import * #1.创建套接字 udpSocket = socket(AF_INET ...

  10. SpringMVC之RequestMappingHandlerMapping

    <mvc:annotation-driven content-negotiation-manager="" enable-matrix-variables="tru ...