爆肝将近 10 万字讲解 Node.Js 详细教程

news2024/11/29 8:59:53

1. Node.Js 环境概述

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,用于在服务器端运行 JavaScript。它使用了一个事件驱动、非阻塞式I/O的模型,使得其轻量且高效。Node.js 的包管理器 npm 是全球最大的开源库生态系统。Node.js 能够响应大量的并发请求,适合运用在高并发、I/O密集、少量业务逻辑的场景。

1.1 安装 NodeJs 环境

NodeJs 下载路径:https://nodejs.org/en

在这里插入图片描述

安装完成后可以在命令行中输入 node -v 和 npm -v 检查是否安装成功?

在这里插入图片描述

1.2 globalThis 和 global 变量

Node.js 中不能使用 BOM 和 DOM 的 API,可以使用 console 和定时器 API。

Node.js 中的顶级对象是 global,也可以用 globalThis 访问顶级对象。

<ref *1> Object [global] {
  global: [Circular *1],
  clearInterval: [Function: clearInterval],
  clearTimeout: [Function: clearTimeout],
  setInterval: [Function: setInterval],
  setTimeout: [Function: setTimeout] {
    [Symbol(nodejs.util.promisify.custom)]: [Getter]
  },
  queueMicrotask: [Function: queueMicrotask],
  performance: Performance {
    nodeTiming: PerformanceNodeTiming {
      name: 'node',
      entryType: 'node',
      startTime: 0,
      duration: 36.77699999511242,
      nodeStart: 0.7232999950647354,
      v8Start: 2.644999995827675,
      bootstrapComplete: 26.97859999537468,
      environment: 13.895999997854233,
      loopStart: -1,
      loopExit: -1,
      idleTime: 0
    },
    timeOrigin: 1698760750401.373
  },
  clearImmediate: [Function: clearImmediate],
  setImmediate: [Function: setImmediate] {
    [Symbol(nodejs.util.promisify.custom)]: [Getter]
  }
}

console.log(globalThis === global) // true

2. Buffer 缓冲区

Buffer 中文译为『缓冲区』,是一个类似于 Array 的对象,用于表示固定长度的字节序列。换句话说,Buffer 就是一段固定长度的内存空间,用于处理二进制数据。

2.1 alloc() 和 allocUnsafe()

alloc: 这是 Node.js 中的一个函数,用于在堆中分配内存。它通常用于分配一块具有确定大小的连续内存块。node alloc 函数确保了分配的内存是初始化的,也就是说,分配的内存区域都被初始化为零。这使得它非常适合分配需要清零的内存,例如用于密码学目的的内存。然而,由于它涉及到清零操作,node alloc 的性能可能会略低于 allocUnsafe

allocUnsafe: 这是 V8 JavaScript 引擎(Node.js 的默认 JavaScript 引擎)中的一个函数。它用于在 V8 的堆内存中分配内存,不需要进行初始化。这意味着分配的内存区域可能包含以前分配并释放的垃圾数据。因此,使用 allocUnsafe 分配的内存可能存在数据泄露的风险,特别是在处理敏感数据时。然而,由于不需要进行初始化操作,allocUnsafe 的性能通常会比 node alloc 高。

node allocallocUnsafe 都是用于分配内存的函数,但它们的使用和安全性有所不同。node alloc 提供了初始化的内存分配,适合需要清零的场景,但性能略低。而 allocUnsafe 则提供了未初始化的内存分配,性能较高,但可能存在数据泄露的风险。选择使用哪个函数取决于你的具体需求和安全性要求。

let buf = Buffer.alloc(10);
console.log(buf)
// <Buffer 00 00 00 00 00 00 00 00 00 00>
let buf_2 = Buffer.allocUnsafe(10000);
console.log(buf_2)
// <Buffer 00 06 f5 ff 5b 02 00 00 70 a9 35 f6 5b 02 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ... 9950 more bytes>

2.2 Buffer.from() 创建 Buffer 实例

let buf = Buffer.from("i love you")
console.log(buf)
// <Buffer 69 20 6c 6f 76 65 20 79 6f 75>

Buffer.from() 是 Node.js 的 Buffer 类的一个静态方法,用于创建一个新的 Buffer 实例从指定的 ArrayBuffer,或者在给定的类型数组中。通过

Buffer.from(arrayBuffer[, byteOffset[, length]])
paramdetaildefault
arrayBuffer一个 ArrayBuffer 或共享 ArrayBuffer 对象,将创建 Buffer 对象表示的原始二进制数据
byteOffset(可选)从 ArrayBuffer 中开始读取数据的偏移量(以字节为单位)默认值为 0
length(可选)要读取的字节数默认值为 arrayBuffer.length - byteOffset
let buf1 = Buffer.from(new ArrayBuffer(10));
let buf2 = Buffer.from(new ArrayBuffer(10), 2); 
// 从偏移 2 开始的数据
let buf3 = Buffer.from(new ArrayBuffer(10), 2, 5); 
// 从偏移 2 开始读取 5 个字节的数据

<Buffer 69 20 6c 6f 76 65 20 79 6f 75> 8 bit 8 位存储,两个 16 进制数,00 ~ ff(0 ~ 255)

let buf = Buffer.from("i love you")

buf.forEach(element => {
    console.log(element)
	// 105 32 108 111 118 101 32 121 111 117
});

let buff = Buffer.from([105, 32, 108, 111, 118, 101, 32, 121, 111, 117])
console.log(buff.toString())
// i love you

2.3 UTF-8 编码中文字符 buffer

let buf = Buffer.from("你好")
console.log(buf)
// <Buffer e4 bd a0 e5 a5 bd>

Buffer类在 Node.js 中用于处理二进制数据,其本身并不直接支持 UTF-8 编码。但是,你可以使用Buffer类来存储和操作 UTF-8 编码的字符串。

例如,如果你有一个 UTF-8 编码的字符串,你可以使用Buffer类的构造函数创建一个Buffer对象:

let buf = Buffer.from('你好,世界!', 'utf-8');

在这个例子中,‘你好,世界!’ 是 UTF-8 编码的字符串,Buffer.from 方法用于创建一个新的 Buffer 对象。第二个参数 ‘utf-8’ 指定了字符串的编码格式。

你也可以使用 Buffer.allocUnsafe() 或 Buffer.from() 来创建一个新的 Buffer 对象,并通过 toString() 方法将 Buffer 对象转换为 UTF-8 编码的字符串:

let buf = Buffer.allocUnsafe(13);  
buf.fill('你好,世界!', 0, 13);  
let str = buf.toString('utf-8');  
console.log(str); // '你好,世界!'

在这个例子中,我们使用 Buffer.allocUnsafe() 创建了一个新的 Buffer 对象,并使用 fill() 方法将字符串填充到 Buffer 中。然后,我们使用 toString() 方法将 Buffer 对象转换为 UTF-8 编码的字符串。

3. fs 模块读写文件

fs 是 Node.js 的一个内置模块,它是 Node.js 文件系统模块,用于在服务器端操作文件。它提供了一系列的方法和属性,可以满足用户对文件的操作需求。例如,可以读取文件、写入文件、删除文件等。

要在 JavaScript 代码中使用 fs 模块来操作文件,需要先导入 fs 模块。可以使用 const fs = require(‘fs’); 来导入该模块。

3.1 fs 模块常用方法和属性

fs.readFile(path[, options], callback):异步地读取文件的内容。path 是文件路径,options 可选,通常不需要指定,callback 是回调函数,它会在文件读取完成后被调用,并包含两个参数:err(错误对象)和 data(文件内容)。

fs.writeFile(path, data[, options], callback):异步地将数据写入文件。path 是文件路径,data 是要写入的数据,options 可选,通常不需要指定,callback 是回调函数,它会在文件写入完成后被调用,并包含两个参数:err(错误对象)和 data(写入的数据)。

fs.unlink(path, callback):异步地删除文件。path 是要删除的文件路径,callback 是回调函数,它会在文件删除完成后被调用,并包含一个参数:err(错误对象)。

fs.mkdir(path[, options], callback):异步地创建目录。path 是要创建的目录路径,options 可选,通常不需要指定,callback 是回调函数,它会在目录创建完成后被调用,并包含一个参数:err(错误对象)。

fs.rename(oldPath, newPath, callback):异步地重命名文件或目录。oldPath 是要重命名的文件或目录的路径,newPath 是新的文件或目录的路径,callback 是回调函数,它会在重命名完成后被调用,并包含一个参数:err(错误对象)。

fs.readdir(path[, options], callback):异步地读取目录的内容。path 是目录路径,options 可选,通常不需要指定,callback 是回调函数,它会在目录读取完成后被调用,并包含两个参数:err(错误对象)和 files(目录中的文件名列表)。

fs.rmdir(path, callback):异步地删除目录。path 是要删除的目录路径,callback 是回调函数,它会在目录删除完成后被调用,并包含一个参数:err(错误对象)。

请注意,这些方法都是异步的,意味着它们不会立即完成。它们通常在回调函数中提供结果,而不是在返回值中提供。因此,需要使用回调函数来处理异步操作的结果。

3.2 fs 流式读写 和 普通读写

const fs = require("fs")

const ws = fs.createWriteStream("helloworld.txt")
ws.write("hello world")
ws.end()

在这里插入图片描述

Node.Js 流式读写和普通读写的应用场景

普通读写:适用于小数据量、单次读写操作。例如,读取文件内容并在控制台输出,或者将数据写入文件。

const fs = require("fs")

fs.readFile("helloworld.txt", (err, data) => {
    if (err) {
        console.log(err)
    } else {
        console.log(data.toString())
    }
})

流式读写:适用于处理大量数据、高并发场景。例如,从网络中读取数据,或者将数据写入到网络中。在流式读写中,数据是按块读取或写入的,而不是一次性加载到内存中,这使得它能够处理大量数据,同时减少内存消耗。

const fs = require("fs")

const rs = fs.createReadStream("helloworld.txt")

rs.on('data', chunk => {
    console.log(chunk.toString())
})

3.3 fs 流式拷贝 和 普通拷贝

在Node.js中,文件系统(fs)模块提供了流式拷贝和普通拷贝两种方式。

普通拷贝(fs.readFile和fs.writeFile)是同步的,它们在执行期间会阻塞其他操作,直到整个文件被读取或写入完毕。这种方式适用于小型文件的拷贝,因为它相对简单且易于理解。但是,对于大型文件,普通拷贝可能会导致性能问题,因为它需要一次性将整个文件读入内存或写入磁盘。

流式拷贝(fs.createReadStream和fs.createWriteStream)则是异步的,它们使用了流(Stream)的概念。流是一种可以用于读取或写入数据的通道,它们可以以较小的数据块为单位进行读写,而不需要一次性读取整个文件。这种方式适用于大型文件的拷贝,因为它可以避免一次性读入整个文件而导致的内存占用问题。

流式拷贝

const fs = require('fs')
const process = require('process')

const rs = fs.createReadStream("assets/test.mp4")
const ws = fs.createWriteStream("test_new.mp4")

rs.on("data", chunk => {
    console.log(chunk)
    ws.write(chunk)
    // 65486 more bytes
})

rs.on('end', () => {
    console.log(process.memoryUsage())
})

process.memoryUsage() 是 Node.js 中的一个函数,用于返回当前 Node.js 进程的内存使用情况。这个函数返回一个对象,其中包含了 Node.js 进程使用的各种内存资源的使用情况。这些值可以帮助你了解你的 Node.js 进程的内存使用情况,以便于优化你的代码或诊断内存泄漏等问题。

返回的对象属性

objdetail
rssResident Set Size,这是进程在主内存中(即 RAM)占用的空间量,以字节为单位。
heapTotalV8 引擎已申请的堆内存总量,以字节为单位。
heapUsedV8 引擎已使用的堆内存量,以字节为单位。
external进程使用的外部内存,以字节为单位。
{
  rss: 20463616,	// 20463616 / 1024 / 1024 = 19 MB
  heapTotal: 4866048,
  heapUsed: 4144648,
  external: 281354,
  arrayBuffers: 11146
}

普通拷贝示例

const fs = require('fs');  
  
fs.readFile('source.txt', 'utf8', (err, data) => {  
  if (err) throw err;  
  
  fs.writeFile('destination.txt', data, (err) => {  
    if (err) throw err;  
    console.log('File has been saved!');  
  });  
});

3.4 fs stat() 状态信息

const fs = require("fs")

fs.stat("test_new.mp4", (err, stat) => {
    if (err) {
        console.log(err)
    } else {
    	console.log(stat)
        console.log(stat.isFile())
    }
})
obj methodreturn value type
stats.size文件大小,以字节为单位。
stats.mtime文件修改时间,是一个 Date 对象。
stats.ctime文件创建时间,是一个 Date 对象。
stats.atime文件访问时间,是一个 Date 对象。
stats.birthtime文件的出生时间,是一个 Date 对象(在某些系统上可能不可用)。
stats.uid文件的用户 ID。
stats.gid文件的组 ID。
stats.mode文件的权限模式。
stats.ino文件的 inode 号码。
stats.dev文件的设备号码。
stats.nlink文件的硬链接数量。
stats.isFile()如果这是一个文件,返回 true。
stats.isDirectory()如果这是一个目录,返回 true。
stats.isBlockDevice()如果这是一个块设备,返回 true。
stats.isCharacterDevice()如果这是一个字符设备,返回 true。
stats.isSymbolicLink()如果这是一个符号链接,返回 true(只在 Unix 系统中有效)。
stats.isFIFO()如果这是一个 FIFO(命名管道),返回 true。
stats.isSocket()如果这是一个套接字,返回 true。
Stats {
  dev: 810007100,
  mode: 33206,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: 4096,
  ino: 1407374883944336,
  size: 57077833,
  blocks: 111488,
  atimeMs: 1698839970416.1738,
  mtimeMs: 1698839970416.1738,
  ctimeMs: 1698839970416.1738,
  birthtimeMs: 1698839007835.6604,
  atime: 2023-11-01T11:59:30.416Z,
  mtime: 2023-11-01T11:59:30.416Z,
  ctime: 2023-11-01T11:59:30.416Z,
  birthtime: 2023-11-01T11:43:27.836Z
}

3.5 __dirname 执行路径

在Node.js中,__dirname是一个全局变量,表示当前正在执行的脚本所在的目录路径。它是一个字符串(String)类型的值,包含了当前脚本所在的目录路径。

这个变量在Node.js中非常有用,因为它可以帮助你在脚本中引用当前目录或子目录中的文件或模块。通过使用__dirname变量,你可以构建相对路径来引用其他文件或模块,或者执行一些与当前目录相关的操作。

console.log(__dirname)

4. http 模块网络编程

HTTP(Hypertext Transfer Protocol)是一种用于在网络上传输数据的协议,它定义了客户端与服务器之间的通信规则。HTTP协议基于请求/响应模型,客户端向服务器发送请求,服务器响应请求并返回数据。HTTP协议使用明文的方式传输内容,因此不适合传输敏感信息。HTTP协议的版本主要有HTTP/1.0和HTTP/1.1,其中HTTP/1.1是目前最常用的版本。

HTTP协议的特点是简单、灵活、无连接和无状态。简单是指协议的结构简单,易于理解和实现;灵活是指协议具有良好的扩展性,可以在不改变核心协议的情况下添加新的功能;无连接是指每次请求都需要建立连接,而无状态是指服务器不会为每个请求保持状态。

4.1 request 和 response

在计算机科学和网络编程中,request 和 response 是HTTP协议中的核心概念。它们分别表示客户端向服务器发送的请求和服务器对请求的响应。

HTTP请求(request)是由客户端(通常是Web浏览器)向服务器发送的,用于请求访问网页或资源。

方法(GETPOSTPUTDELETE等)
请求URL(资源的路径和名称)
请求头(header),包含关于请求的附加信息,如内容类型(Content-Type)、字符集(Charset)等
请求体(body),包含要发送的数据,如表单数据或JSON数据等

HTTP响应(response)是由服务器对客户端发送的请求进行响应的结果。

状态码(status code),表示请求的处理结果,如200表示成功,404表示未找到资源等
响应头(header),包含关于响应的附加信息,如内容类型(Content-Type)、字符集(Charset)等
响应体(body),包含服务器返回的数据,如网页内容、JSON数据等

在Web开发中,HTTP请求和响应是实现客户端与服务器之间通信的关键。通过发送HTTP请求来获取网页或资源,并接收HTTP响应来获取结果。

4.2 创建 http server

const http = require("http")

const server = http.createServer((request, response) => {
    console.log(request.method)
    response.setHeader("content-type", "text/html;charset=utf-8")
    response.end("唤醒手腕")
})

server.listen(9000, ()=> {
    console.log("server run")
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1159899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java架构师知识产权与标准化

目录 1 导学2 知识产权概述3 保护期限4 知识产权人的确定4 侵权判断5 标准划分想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学 2 知识产权概述 知识产权是指公民、法人、非法人单位对自己的创造性智力成果和其他科技成果依法享有的民事权。是智力成果的创造人依…

AI“走深向实”,蚂蚁蚁盾在云栖大会发布实体产业「知识交互建模引擎」

数字化起步晚、数据分散稀疏、专业壁垒高、行业知识依赖「老师傅」&#xff0c;是很多传统产业智能化发展面临的难题。2023年云栖大会上&#xff0c;蚂蚁集团安全科技品牌蚁盾发布“知识交互建模引擎”&#xff0c;将实体产业知识与AI模型有机结合&#xff0c;助力企业最快10分…

二进制基础

最近开始入坑系统安全大坑&#xff0c;调转方向开始了解pwn&#xff0c;那就要补一些那少得可怜的底层基础啦 先学几个单词&#xff1a; exploit&#xff1a;用于攻击的脚本与方案payload&#xff1a;攻击载荷&#xff0c;是目标进程被劫持控制流的数据&#xff08;精心构造的…

Python画图之HelloKitty

Python-turtle画出HelloKitty&#xff08;有趣小游戏&#xff09; 一、效果图二、安装库1.常用镜像源2.库下载 三、Python代码 一、效果图 二、安装库 1.常用镜像源 1. 豆瓣http://pypi.douban.com/simple/ 2. 清华大学&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple…

智能视频监控平台EasyCVR出现偶发通道在线,但是无法播放的情况要怎么解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储…

Scrum of Scrums大规模敏捷管理流程

​​​​​​​Leangoo领歌​​​​​​​是一款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低&#xff0c;可帮助企业快速落地敏捷&#xff0c…

Linux学习之进程二

目录 进程状态 R (running)运行状态与s休眠状态&#xff1a; disk sleep&#xff08;深度睡眠状态&#xff09; T (stopped)&#xff08;暂停状态&#xff09; t----tracing stop(追踪状态) X死亡状态&#xff08;dead&#xff09; Z(zombie)-僵尸进程 孤儿进程 进程优…

Android问题

这里面要加入 ,加入前是点击待君登录直接跳回手机主界面了 加入上述代码即可 Android之Inflate() Inflate()作用就是将xml定义的一个布局找出来&#xff0c;但仅仅是找出来而且隐藏的&#xff0c;没有找到的同时并显示功能。 android上还有一个与Inflate()类似功能的…

【AI视野·今日CV 计算机视觉论文速览 第274期】Tue, 24 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Tue, 24 Oct 2023 Totally 138 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;Wonder3D, 基于交叉扩散模型的单图像三维形状生成。(from 香港大学) website:https://www.xxlong.site/Wonder3D/ Daily Co…

Flutter 04 按钮Button和事件处理、弹框Dialog、Toast

一、按钮组件 1、按钮类型&#xff1a; 2、按钮实现效果&#xff1a; import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);overrideWidget build(BuildContext co…

X64(64位)汇编指令与机器码转换原理

X64&#xff08;64位&#xff09;汇编指令与机器码转换原理 1 64位寻址形式下的ModR/M字节1.1 寻址方式1.2 寄存器编号 2 汇编指令转机器码2.1 mov rcx, 1122334455667788h2.2 mov rcx,[r8]与mov [r8],rcx2.3 mov rcx,[r8r9*2] 本文属于《 X86指令基础系列教程》之一&#xff…

重温云栖,分享十年成长:我和云栖的故事

文章目录 前言活动背景我和云栖的交际历届峰会主题2009201020112012201320142015201620172018202120222023 技术带来的变化工作生活关注的领域 后记 前言 云栖大会&#xff0c;前身可追溯到2009年的地方网站峰会&#xff0c;2011年演变为阿里云开发者大会&#xff0c;2015年正式…

python线程(进程子单位)

进程是由CPU给分配的执行单元&#xff0c;比较消耗空间和内存 创建、使用线程 import threading# 进程 # 线程 from time import sleepdef download():list1 ["girl.png", "boy.png", "child.png"]for l in list1:print(l)sleep(1.5)print(&qu…

ThinkPad T14 2023评测|thinkpad t14 gen4

一、购买地址 我在淘宝、京东、联想商城、苏宁易购都看了看&#xff0c;最终确定了在抖音官方商城买电脑&#xff0c;主要是价格低&#xff0c;足足少了四百&#xff0c;还送了一个电脑包和一个鼠标。 二、硬件信息 2.1 内存 这个运行内存比较有意思&#xff0c;我还是第一次买…

前端JavaScript

文章目录 一、JavaScript概述JS简介1.ECMAScript和JavaScript的关系2.ECMAScript的历史3.什么是javas&#xff1f;4.JavaScript的作用&#xff1f; 三者之间的作用JS基础1.注释语法2.引入js的多种方式3.结束符号 变量与常量变量1.JavaScript声明2.var与let的区别常量 基本数据类…

【Linux进程】再谈软件—操作系统(Operator System)

目录 操作系统(Operator System) 概念 设计OS的目的 如何理解 "管理"——先描述再组织 系统调用和库函数概念 总结 操作系统(Operator System) 概念 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。 笼统的理解&#xff0c;操作系统…

206. 反转链表、Leetcode的Python实现

博客主页&#xff1a;&#x1f3c6;看看是李XX还是李歘歘 &#x1f3c6; &#x1f33a;每天分享一些包括但不限于计算机基础、算法等相关的知识点&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知识点&#x1f4d6;是你想要的&#x1f497; ⛽️今…

Springboot+shiro,完整教程,带你学会shiro

您的第一个 Apache Shiro 应用程序 引入依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoc…

一文深入了解 CPU 的型号、代际架构与微架构

在 10 月 16 号的时候&#xff0c;Intel 正式发布了第 14 代的酷睿处理器。但还有很多同学看不懂这种发布会上发布的各种 CPU 参数。借着这个时机&#xff0c;给大家深入地讲讲 CPU 的型号规则、代际架构与微架构方面的知识。 CPU 在整个计算机硬件中、技术体系中都算是最最重…

关于pytorch张量维度转换及张量运算

关于pytorch张量维度转换大全 1 tensor.view()2 tensor.reshape()3 tensor.squeeze()和tensor.unsqueeze()3.1 tensor.squeeze() 降维3.2 tensor.unsqueeze(idx)升维 4 tensor.permute()5 torch.cat([a,b],dim)6 torch.stack()7 torch.chunk()和torch.split()8 与tensor相乘运算…