首页 > 其他分享 >【从零开始学习Go语言】八.Go语言的数组切片引用类型与值类型(总结)

【从零开始学习Go语言】八.Go语言的数组切片引用类型与值类型(总结)

时间:2023-11-09 10:35:56浏览次数:37  
标签:arr 语言 fmt Println 与值 数组 Go array main



【从零开始学习Go语言】Go语言的数组与切片引用类型与值类型

  • 一.数组
  • 二.多维数组
  • 三.切片
  • 四.值类型与引用类型



一.数组

go语言的数组在之前的一些例子中有引用过,go的数组在创建时需要声明存储数据的类型,长度,并且长度在确定后便不可增加,类似python中的元组

  • 数组的声明方式有多种:
  • 第一种
package main

import (
	"fmt"
)

func main() {
	var array [10]int			//创建并初始化默认值为0,长度为10
	fmt.Println(array)			//这里打印可以看到输出的数组全部都是10
    
    array[0]=1					//[]中的是索引
    array[1]=2					
    array[2]=3
    //···
    fmt.Println(array)			//这里输出就发现内容的值已经被填充,当然还有更简单的方法做这非常简单的操作,这里只是基础的解释
    
    
}
  • 第二种
package main

import (
	"fmt"
)

func main() {
	var arr = [3]int{1,2,3}			//使用var创建名称为arr的数组,arr的类型是什么取决于=后面的表达式,使用此方法可直接初始化并赋值
	fmt.Println(arr)
}
  • 第三种
package main

import (
	"fmt"
)

func main() {
	arr := [5]int{1, 2, 3, 4, 5}	 //简单方法声明,不过注意这种声明变量的方法只能用在方法内部
    								 //比如现在的arr是在main的内部,如在外部也就是和package平级
    								 //下需要使用var命名,了解js的应该更容易理解,与作用域相似
	fmt.Println(arr)
}
  • 第四种

有时数组传入的参数可能不确定或经常需要修改,每次都需要修改长度可能感觉很麻烦,这时就可以使用下面的方法啦,注意这里的修改不是添加,而是初始化的参数

package main

import (
	"fmt"
)

func main() {
	var arr = [...]int{1,2,3}			//这里的三个...根据传入的参数长度而确定数组的长度,从而不必每次都修改长度
	fmt.Println(arr)
}

二.多维数组

所谓多维数组或二维数组,其实就是一个数组中嵌套另一个数组,注意数组设置的长度不包括二维数组或多维数组的长度。结构大概如下:

代码演示:

//二维数组
package main

import (
	"fmt"
)

func main() {
	arr := [2][3]int{		//2是包含两个数组,3是每个数组长度为3
		{1, 2, 4},
		{1, 2}}
	fmt.Println(arr)		[[1 2 4] [1 2 0]]
	fmt.Println(arr[0])		[1 2 4]//打印第一个数组,索引为0
	fmt.Println(arr[0][2])	 4//取出索引为0的数组并搜索其中索引为2的数字:4
}

三.切片

数组的长度是固定且不课修改的,而切片的表达方式与数组基本一样,但大小不做限制,类似python中的数组

package main

import (
	"fmt"
)

func main() {
	arr := []int{1, 2, 3, 4, 5, 6}
	fmt.Println(arr)
}

不填写长度就是切片啦,不过这里注意一点,切片的长度第一次初始化是根据所传入参数长度确认,第二次是根据第一次传入的参数长度为基准,话有点绕,下面演示个例子

package main

import (
	"fmt"
)

func main() {
	arr := []int{1, 2, 3, 4, 5, 6}
	fmt.Println(cap(arr))		//6;cap查看的是切片的空间大小,也就是这个比如数组的长度设置了长度为10,实际使用了3,len返回的是3,而cap是10
	arr = append(arr, 1, 2, 3)
	fmt.Println(cap(arr))		//12;当切片长度增加,go会根据这个切片的原始长度叠加,假如第二次添加的数据没有达到12,它是不会再次叠加的
}

四.值类型与引用类型

  • 这里用一个例子来介绍吧:
package main

import (
	"fmt"
)

func main() {
	//值类型
	fmt.Println("\n---------------值类型-------------------------")
	arr := [...]int{1, 2, 3, 4}

	a := arr
	fmt.Printf(" arr原值:%d,a原值:%d \n", arr, a)
	a[1] = 5
	fmt.Printf(" arr的值:%d \n arr的内存地址:%p \n a的值:%d \n a的内存地址:%p", arr, &arr, a, &a)
	//引用类型
	fmt.Println("\n---------------引用类型-------------------------")
	array := []int{1, 2, 3, 4}

	b := array
	fmt.Printf(" array原值:%d,b原值:%d \n", array, b)
	b[1] = 5
	fmt.Printf(" array的值:%d \n array的内存地址:%p \n b的值:%d \n b的内存地址:%p", array, &array, b, &b)

}

返回:

---------------值类型-------------------------
 arr原值:[1 2 3 4],a原值:[1 2 3 4] 
 arr的值:[1 2 3 4] 
 arr的内存地址:0xc00001c1c0 
 a的值:[1 5 3 4] 
 a的内存地址:0xc00001c1e0
---------------引用类型-------------------------
 array原值:[1 2 3 4],b原值:[1 2 3 4] 
 array的值:[1 5 3 4] 
 array的内存地址:0xc00000c080 
 b的值:[1 5 3 4] 
 b的内存地址:0xc00000c0a0


标签:arr,语言,fmt,Println,与值,数组,Go,array,main
From: https://blog.51cto.com/u_16343585/8273004

相关文章

  • IDEA 关闭SpringBoot启动Logo/图标
     一、环境1、SpringBoot2.6.4 MavenPOM格式<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/></par......
  • Django——增加自定义功能
    在Django中,增加一个自己的功能,并在Django运行中创建一个进程,单独运行。#如果需要在运行时,同时运行某个程序代码,那么在wsgi中添加即可。fromnetwork_configimporttestfrommultiprocessingimportProcessif__name__=='gb_netconf.wsgi':#windows中必须要写,如果不......
  • R语言EG(Engle-Granger)两步法协整检验、RESET、格兰杰因果检验、VAR模型分析消费者价
    全文链接:http://tecdat.cn/?p=31108原文出处:拓端数据部落公众号作为衡量通货膨胀的基本指标,消费者价格指数CPI和生产者价格指数PPI的作用关系与传导机制一直是宏观经济研究的核心问题。对此问题的研究显然具有重要的学术价值与现实意义:当PPI先行地引导着CPI的变动,则意味着上游......
  • 分享2023全新GO工程师面试总攻略,助力快速斩获offer
    点击下崽:分享2023全新GO工程师面试总攻略,助力快速斩获offer  提取码:k8c8GO(Golang)是一种快速、高效、牢靠、平安的编程言语,被普遍应用于后端开发、云计算、人工智能等范畴。在GO工程师面试中,面试官通常会调查我们的编程才能、系统设计才能、算法和数据构造等方面的学问。本文将引......
  • c#操作mongodb数据库工具类
    新建c#项目,在nuget中引入MongoDB.Driver驱动,然后新建一个MongoDBToolHelper类,将下面代码复制进去usingMongoDB.Bson;usingMongoDB.Bson.Serialization;usingMongoDB.Driver;usingMongoDB.Driver.Builders;usingSystem;usingSystem.Collections.Generic;usingSystem......
  • Django 部署指南
    远程登录服务器sudosshroot@user_name#删除原来的ssh密钥命令ssh-keygen-f"/home/shimmer/.ssh/known_hosts"-R"117.72.9.46"延长服务器ssh超时自动断开时间,此处为30分钟#默认情况下,SSH配置文件位于/etc/ssh/sshd_config。ClientAliveInterval1800ClientAliveCountM......
  • 【django开发】知识经验总结共50页md文档。今日分享:django配置和数据库操作详解
    Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(DoNotRepeatYourself)原......
  • 初识Django
    web框架web框架本质上可以看成是一个很强大的socket服务端,用户的浏览器可以看成是拥有可视化界面的socket客户端,两者通过网络请求实现数据交互,也可以从框架层面上先简单的将web框架看成是对前端、数据库的全方位整合web手敲框架步骤1.搭建socket服务端importsocketserver......
  • 2023-11-08:用go语言,字符串哈希原理和实现 比如p = 233, 也就是课上说的选择的质数进制
    2023-11-08:用go语言,字符串哈希原理和实现比如p=233,也就是课上说的选择的质数进制"31256..."01234hash[0]=3*p的0次方hash[1]=3*p的1次方+1*p的0次方hash[2]=3*p的2次方+1*p的1次方+2*p的0次方hash[3]=3*p的3次方+1*p的2次方+2*p......
  • Django前提
    今日内容概要web应用程序手写web框架(帮助我们理解别人写好的成熟框架、重点在于思路的理解、代码无需掌握)Django框架的学习Python中得主流框架框架的下载、安装、版本、怎么启动、怎么使用等三板斧问题今日内容详细web应用程序#Django框架是一款专门用来开发web应......