zoukankan      html  css  js  c++  java
  • Golang数组和切片的区别

    Golang数组和切片的区别

    简述

    golang数组和切片的区别

    • 声明方式不同,数组需要指定大小,而切片不用
    • 数组是值传递,切片是引用传递

    demo

    package main
    
    import "fmt"
    
    func main() {
    	fmt.Println("--------------------数组声明与赋值-----------------")
    	// 指定数组大小
    	var a1 [5]int
    	// 自动推断数组大小
    	a2 := [...]int{1, 2, 3}
    	fmt.Println("a1=",a1,"a2=",a2)
    
    	// 按索引赋值
    	a3 := [...]int{2: 2, 4: 4}
    	fmt.Println("a3=",a3)
    	// 按索引赋值
    	a4 := [6]int{2: 2, 4: 4}
    	fmt.Println("a4=",a4)
    
    	fmt.Println("-------------------- 切片声明与初始化-----------------")
    	// 定义切片
    	var b1 []int
    	fmt.Println("b1=",b1)
    
    	// 初始化
    	b2 := make([]int, 3, 5)
    	fmt.Printf("b2=%v,len=%d,cap=%d
    ", b2, len(b2), cap(b2))
    
    
    	fmt.Println("--------------------值传递与引用传递-----------------")
    	a := [4]float64{67.7,89.9,21,78}
    	b := []int{2,3,5}
    	fmt.Printf("变量a---地址:%p,类型:%T,数值:%v,长度:%d 
    ",&a,a,a,len(a))
    	fmt.Printf("变量b---地址:%p,类型:%T,数值:%v,长度:%d 
    ",&b,b,b,len(b))
    
    	c := a
    	d := b
    	fmt.Printf("变量c---地址:%p,类型:%T,数值:%v,长度:%d 
    ",&c,c,c,len(c))
    	fmt.Printf("变量d---地址:%p,类型:%T,数值:%v,长度:%d 
    ",&d,d,d,len(d))
    
    	a[1] = 200
    	fmt.Println("a=",a,"c=",c)
    	d[0] = 200
    	fmt.Println("b=",b,"d=",d)
    }
    

    输出

    --------------------数组声明与赋值-----------------
    a1= [0 0 0 0 0] a2= [1 2 3]
    a3= [0 0 2 0 4]
    a4= [0 0 2 0 4 0]
    -------------------- 切片声明与初始化-----------------
    b1= []
    b2=[0 0 0],len=3,cap=5
    --------------------值传递与引用传递-----------------
    变量a---地址:0xc00008c040,类型:[4]float64,数值:[67.7 89.9 21 78],长度:4 
    变量b---地址:0xc00007c040,类型:[]int,数值:[2 3 5],长度:3 
    变量c---地址:0xc00008c0c0,类型:[4]float64,数值:[67.7 89.9 21 78],长度:4 
    变量d---地址:0xc00007c0a0,类型:[]int,数值:[2 3 5],长度:3 
    a= [67.7 200 21 78] c= [67.7 89.9 21 78]
    b= [200 3 5] d= [200 3 5]
    
    

    分析

    a和c之间是值传递,相当于复制了一份,所以改变a中的值,c不会受到影响
    b和d之间是引用传递,指向的是同一个,所以改变了d中的值,b也被改变了

  • 相关阅读:
    双击导航栏自动滑动ListView到顶部
    及时取消代码中的AsyncTask
    Nubia Z9 mini使用体验
    特殊情况特殊处理
    SharePreferences的DB实现
    时下手机和p2p理财的共同点
    小米空气净化器体验
    消息框架的一种实现
    刷了MIUI的手机在OSX下连接USB调试的方法
    16个最佳响应式HTML5框架
  • 原文地址:https://www.cnblogs.com/Kingram/p/12764583.html
Copyright © 2011-2022 走看看