首页 > 其他分享 >Go语言--复合类型之切片

Go语言--复合类型之切片

时间:2024-07-07 14:56:17浏览次数:15  
标签:slice -- fmt 切片 int num 数组 Go

slice概念

数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求。Go语言提供了数组切片(slice)来弥补数组的不足。
切片并不是数组或数组指针,它通过内部指针和相关属性引用数组片段,以实现变长方案。
slice 并不是真正意义上的动态数组,而是一个引用类型。slice 总是指向一个底层 array,slice的声明也可以像 array 一样,只是不需要长度。
在这里插入图片描述

  • 【low:high:max】长度为high-low,容量为max-low
    在这里插入图片描述

切片和数组的区别

  • 数组[]里面的长度是固定的一个常量,数组不能修改长度, len和cap永远都是[]里面规定的。
  • 切片[]里面为空,或者为…,切片的长度或容量可以不固定。
    在这里插入图片描述

切片的创建

  • 自动推导类型
  • 借助make函数,格式make(切片类型,长度,容量),没有指定容量的话,容量和长度一样。
    在这里插入图片描述

切片的截取

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

切片和底层数组

切片并不是数组或数组指针,它通过内部指针和相关属性引用数组片段,以实现变长方案。
在这里插入图片描述

切片内建函数

append

在原切片的末尾添加元素
在这里插入图片描述
append 函数会智能地底层数组的容量增长,一旦超过原底层数组容量,通常以2倍容量重新分配底层数组,并复制原来的数据。

在这里插入图片描述

copy

函数 copy 在两个 slice 间复制数据,复制长度以 len 小的为准,两个 slice 可指向同一底层数组。
在这里插入图片描述

切片做函数参数

  • 只能以引用的方式进行传递
    在这里插入图片描述

猜数字游戏

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func CreatNum(p *int) {
	//设置种子,只需要一次
	rand.Seed(time.Now().UnixNano())

	var num int
	for {
		num = rand.Intn(10000)
		if num >= 1000 {
			break
		}
	}
	*p = num
}

func GetNum(s []int, num int) {
	s[0] = num / 1000
	s[1] = num % 1000 / 100
	s[2] = num % 100 / 10
	s[3] = num % 10
}

func OnGame(randSlice []int) {
	var num int
	keySlice := make([]int, 4)
	for {
		for {
			fmt.Printf("请输入一个四位数:")
			fmt.Scan(&num)
			if 999 < num && num < 10000 {
				break
			}
			fmt.Printf("输入的不符合要求,请重新输入\n")
		}
		GetNum(keySlice, num)

		n := 0
		for i := 0; i < 4; i++ {
			if randSlice[i] < keySlice[i] {
				fmt.Printf("第%d位大了一点\n", i+1)
			} else if randSlice[i] > keySlice[i] {
				fmt.Printf("第%d位小了一点\n", i+1)
			} else {
				fmt.Printf("第%d猜对了!\n", i+1)
				n++
			}
		}

		if n == 4 {
			fmt.Printf("全猜对了!\n")
			break
		}
	}

}
func main() {
	var randNum int

	//产生四位的随机数
	CreatNum(&randNum)
	//fmt.Println("randNum=", randNum)

	randSlice := make([]int, 4)
	//保存四位中的每一位
	GetNum(randSlice, randNum)

	OnGame(randSlice)
}

在这里插入图片描述

标签:slice,--,fmt,切片,int,num,数组,Go
From: https://blog.csdn.net/m0_73537205/article/details/140083846

相关文章

  • JSP静态Webshell编码
    #0x00 背景介绍JSP静态Webshell分析,包括unicode、html、cdata、特殊字体编码等,相互结合以达到欺骗效果。#0x01unicode编码JSP中可以解析unicode编码,通过contentType字段定义。原始一句话如下:Stringcmd=request.getParameter("cmd");Processprocess=Runtime.getRu......
  • Go语言--复合类型之指针与数组
    分类指针指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。Go语言对指针的支持介于Java语言和C/C++语言之间,它既没有想Java语言那样取消了代码对指针的直接操作的能力,也避免了C/C++语言中由于对指针的滥用而造成......
  • GraalVM简介及使用
    在本文中,我们将回顾GraalVM是什么、它是如何工作的,以及即时(JIT)编译和提前(AOT)编译之间的区别?GraalVM是一种高性能运行时,为用Java和其他语言编写的应用程序提供了显着的优势。它由Oracle开发,通过利用高级优化和独特的架构,可以更快、更高效地运行应用程序。1.......
  • 前端随手记第三天
    1.HTML<fieldset>name属性定义和用法:name属性规定fieldset的名称。name属性用于在JavaScript中引用元素,或者在表单提交之后引用表单数据。语法:<fieldsetname="text"> <!DOCTYPEhtml><html><head> <meta charset="utf-8"> <title>菜鸟教......
  • 20240705
    T1NFLSOJP5030最小表示考虑两个串本质相同的条件,发现如果计算出每一位上的字母距离它上一次出现的距离\(dis_i\),那两个串本质相同等价于所有\(dis_i\)相同。注意到这个东西只和相对位置有关,所以只需要先对原串求一遍\(dis\)数组,然后对这个\(dis\)数组后缀排序一下,求出......
  • 选择结构
    选择结构if单选择:if(布尔表达式){//true执行的语句}if双选择:if(布尔表达式){//true执行的语句}else{//false执行的语句}if多选择:if(布尔表达式1){//true执行的语句}elseif(布尔表达式2){//true执行的语句}elseif(布尔表达式3){//true执行......
  • 24-暑假软件工程周报(1)
    7-1-7-7第一周工作时间:7月1日14:00-17:00工作内容:担任组长完成课题规划,本人分到PTA课题7-57-67-77-13。完成课题7-5,配置恢复vscode中C++编程环境,进行课题7-5测试。测试结果:通过 工作时间:7月2日14:00-17:0019:00-20:30工作内容:进行课题7-6,复习数据结构课程散列......
  • let 声明的变量,只在代码块内有效
    {leta=10;varb=1;}a//ReferenceError:aisnotdefinedb//1for循环的计数器,就很适合使用let命令。for(leti=0;i<10;i++){//...}console.log(i);//ReferenceError:iisnotdefined上面代码中,计数器i只在for循环体内......
  • seo外链发布:如何选择合适的外链发布平台?
    在进行seo优化的过程中,外链发布是一个非常重要的环节。选择合适的外链发布平台可以帮助我们提升网站的权威性和排名。那么,如何选择合适的外链发布平台呢?下面为您解答。1.网站的权威性选择外链发布平台时,首先要考虑的是该网站的权威性。一个权威性高的网站,其外链对于提升网站的......
  • 24-暑假软件工程日报(7_5)
    工作时间:7月5日8:00-11:00 14:00-17:00 工作内容:完成组长大程序验收学习Oracle数据库架构代码:#include<fstream>#include<iostream>#include<stdio.h>#include<stdlib.h>usingnamespacestd;voidmenu(){cout<<"************菜单********......