Go语言入门(三)数组和切片
时间:2022-07-25
本文章向大家介绍Go语言入门(三)数组和切片,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
数组和切片
数组
定义:同一类型的元素集合
var a[3]int //定义一个数组,数组的下标是从0开始,长度为n的数组下标的有效范围是0到n-1
func arraySet() {
var a[6] int
a[0] = 1
a[1] = 2
fmt.Printf("array is %vn",a)
var b[3]int = [3]int{1,2,3}
fmt.Println(b)
c := [...]int{1,3,4}
fmt.Println(c)
d := [3]int{10}
fmt.Println(d)
e := [3]int{2:10} // 下标为2的值设置为10
fmt.Println(e)
}
数组要保持类型一致,长度一致,这样才能做等值的赋值
数组遍历
func loopArray() {
a := [...]int{1,2,3,4,5,6,7,8,9,10}
for index,val := range a {
fmt.Printf("index:%dtvalue:%dn",index,val)
}
b := [6]string{"a","b","c","d","e","f"}
for i:=0;i<len(b);i++ {
fmt.Printf("index:%dtvalue:%sn",i,b[i])
}
}
二维数组与遍历
func doubleArray() {
var a[3][2]string = [3][2]string{
{"lion","tiger"},
{"cat","dog"},
{"pig","pigwan"},
}
fmt.Println(a)
}
func printArray(a[3][2]string) {
for _,v1 := range a {
for _,v2 := range v1 {
fmt.Printf("%sn",v2)
}
fmt.Printf("n")
}
}
func main() {
loopArray()
doubleArray()
var b[3][2] string
b[0][0] = "apple"
b[0][1] = "banana"
b[1][0] = "sumsung"
b[1][1] = "huawei"
b[2][0] = "茄子"
b[2][1] = "鸡儿"
printArray(b)
}
数组拷贝和传参
- 数组是值类型
func transArray() {
var a [3]int
a[0] = 10
a[1] = 20
a[2] = 30
b := a
b[0] = 1000
fmt.Println(a,b)
fmt.Printf("%pt%pn",&a,&b)
}
func modifyB(b [3]int) {
b[0] = 1000
return
}
切片
定义
- 基于数组类型的一层封装。非常灵活,可以扩容
- 切片初始化,a[start:end]创建一个包括从start到end-1的切片
- 数组是值类型,切片是引用类型
func modifySlice() {
//定义数组
darr := [...]int{157,89,90,82,100,78,67,69,59}
// 创建切片
dslice := darr[2:5]
fmt.Printf("slice before %vn",dslice)
fmt.Printf("array before %vn",darr)
for i := range dslice {
dslice[i] ++
}
fmt.Printf("array after %vn",darr)
fmt.Printf("after slice %vn",dslice)
}
切片的基本操作
- arr[start:end] : 包括start到end-1之间的所有元素
- arr[start:] : 包括start开始到最后一个元素之间所有的元素
- arr[:end]: 包括从0开始到end-1之间的所有元素
- arr[:] :包括整个数组所有的元素
使用make创建切片
func makeSlice() {
i := make([]int,5,10)
i[0] = 0
i[1] = 1
i[2] = 2
i[3] = 3
i = append(i, 5) //从长度+1开始append
i = append(i,6,7,8,9,10,11,12,13) // 追加多个值,自动扩容
fmt.Printf("%vtlen %dtcap %dn",i,len(i),cap(i))
}
切片拷贝
func rewriteSlice() {
var a[]int = make([]int,5,5)
b := a
fmt.Printf("【修改前】a的地址%p,a的值%v;b的地址%p,b的值%vn",&a,a,&b,b)
a = append(a,10) //a的地址和
fmt.Printf("【修改后】a的地址%p,a的值%v;b的地址%p,b的值%vn",&a,a,&b,b)
}
切片的再切片
func sliceAgain() {
var a []int
var b [6]int = [6]int{1,2,3,4,5,6}
a = b[0:4]
fmt.Printf("a的长度%d,容量%d,类型%Tn",len(a),cap(a),a)
c := b[1:4]
fmt.Printf("c的长度%d,容量%d,类型%Tn",len(c),cap(c),c) //c的长度是3,容量是5,因为开头从1开始,引用底层的b也就少了一位
d := a[0:2]
fmt.Printf("d的长度%d,容量%d,类型%Tn",len(d),cap(d),d) //d是a的切片的再切片,所以容量和a一致,长度以截取的长度为准
}
空切片
var a []int //未被初始化,没有分配长度和容量(没有内存空间),所以称之为空切片,append可以自动扩容,免去初始化的过程,nil是个空地址的意思
func noneSlice() {
var name []string
if name == nil {
fmt.Printf("this is none slice %vn",name)
name = append(name, "wanghui","devops")
fmt.Printf("none slice append value %vn",name)
}
}
// 切片的append
func appendSlice() {
var b []int = []int{1,2,3,4}
var a []int
a = append(a,b...) //在a里面追加b(...就是展开b的元素的意思)
}
切片传参
证明切片是引用传递
func transArgs(a []int) {
fmt.Printf("%pn",a)
for i := range a{
a[i] = 111
fmt.Println(a[i])
}
}
func main() {
nums := []int{1,2,3,4}
fmt.Printf("%pn",nums)
transArgs(nums)
fmt.Printf("%pn",nums) // 参数会被改变
}
切片的拷贝
copy(dest,src) 拷贝之后,各自的地址不会发生改变,只是拷贝目的地的值发生了改变
func copySlice() {
a := []int{1,2,3}
b := []int{7,8}
copy(b,a)
fmt.Printf("a=%v,len(a)=%d,addr(a)=%ptb=%v,len(b)=%d,addr(b)=%pn",
a,len(a),&a,
b,len(b),&b)
}
课后作业与参考
- 求数组的所有元素之和
func arraySum() {
var arr [10]int
for i:=0;i<len(arr);i++ {
arr[i] = rand.Intn(10000)
}
var sum int
for j:=0;j<len(arr);j++ {
sum += arr[j]
}
fmt.Printf("arr is %vnsum=%dn",arr,sum)
}
- 找出数组中指定元素相加等于8的下标 比如 arr := []int{1,3,5,8,7} ,下标分别是(0,4),(1,2)
func indexReturn() {
//gen array
var arr [10]int
for i:=0;i<len(arr);i++ {
arr[i] = i
}
//calc
fmt.Println(arr)
for i:=0;i<len(arr);i++ {
for j:=i+1;j<len(arr);j++ {
if (arr[j]+arr[i]==12) {
fmt.Printf("arr下标和等于12的下标是i=%d,j=%dn",i,j)
}
}
}
}
- 使用sort函数进行数组排序
func useSort() {
var arr [10]int
for i:=0;i<len(arr);i++ {
arr[i] = rand.Intn(10000)
}
fmt.Printf("before sort %vn",arr)
sort.Ints(arr[:])
fmt.Printf("after sort %vn",arr)
}
- 实现一个密码生成工具,支持以下功能
- 指定密码长度,默认16位
- 使用类型选择,生成不同类型的密码
package main
import (
"flag"
"fmt"
"math/rand"
"time"
)
var (
numCharset = "0123456789"
strCharset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
mixCharset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
advanceCharset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()"
)
func geneLetter() {
//获取26个字母
start := 'A'
for i:=0;i<26;i++{
fmt.Printf("%c",start)
start += 1
}
}
func main() {
var length int
var charset string
flag.IntVar(&length,"l",16,"-l the length of passwd")
flag.StringVar(&charset,"t","mix","-t the charset of passwd")
flag.Parse()
rand.Seed(time.Now().UnixNano())
var userCharset string
switch charset {
case "num":
userCharset = numCharset
case "char":
userCharset = strCharset
case "mix":
userCharset = mixCharset
case "advance":
userCharset = advanceCharset
default:
userCharset = mixCharset
}
var password []byte
for i:=0;i < length;i++ {
index := rand.Intn(len(userCharset))
char := userCharset[index]
password = append(password,char)
}
strPassword := string(password)
fmt.Printf("生成的密码是%sn",strPassword)
}
- Spring Boot Debug调试
- Maven精选系列--classifier元素妙用
- PostgreSQL里面的一些命令小结
- Java中创建String的两道面试题及详解
- PostgreSQL主备环境搭建
- Tomcat集群session复制与Oracle的坑。。
- 用Keras+TensorFlow,实现ImageNet数据集日常对象的识别
- JavaWeb项目架构之Elasticsearch日志处理系统
- 分布式服务防雪崩熔断器,Hystrix理论+实战。
- JavaWeb项目架构之Kafka分布式日志队列
- 如何让Git记住用户名和密码
- 金融系统中正确的金额计算及存储方式
- 如何利用深度学习写诗歌(使用Python进行文本生成)
- 注意:字符串substring方法在jkd6,7,8中的差异。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux系统对外开放3306、8080等端口,防火墙设置详解
- Linux中selinux基础配置教程详解
- Linux中如何查看已挂载的文件系统类型详解
- 在 Linux 命令行中使用 tcpdump 抓包的一些功能
- CentOS平台快速搭建LAMP环境的方法
- Linux系统中时间的获取和使用
- 基于Linux搭建Apache网站服务配置详解
- CentOs下手动升级node版本的方法
- 详述Linux中Firewalld高级配置的使用
- CentOS7安装PHP7 Redis扩展的方法步骤
- centos7下rsync+crontab定期同步备份
- 你可能不知道的一些linux文件权限管理方法
- 原来SqlSession只是个甩手掌柜?真正干活的是谁?
- Linux下的定时任务和延时任务的详解
- 使用 chkconfig 和 systemctl 命令启用或禁用 Linux 服务的方法