当前位置: 首页 > news >正文

Golang并发编程及其高级特性

并发编程模型

线程模型:Go的Goroutine

  • Goroutine(M:N 模型)

    package mainimport ("fmt""runtime""sync""time"
    )func main() {// 查看当前机器的逻辑CPU核心数,决定Go运行时使用多少OS线程fmt.Println("CPU Cores:", runtime.NumCPU())// 启动一个Goroutine:只需一个 `go` 关键字go func() {fmt.Println("I'm running in a goroutine!")}()// 启动10万个Goroutine轻而易举var wg sync.WaitGroup // 用于等待Goroutine完成for i := 0; i < 100000; i++ {wg.Add(1)go func(taskId int) {defer wg.Done() // 任务完成时通知WaitGroup// 模拟一些工作,比如等待IOtime.Sleep(100 * time.Millisecond)fmt.Printf("Task %d executed.\n", taskId)}(i)}wg.Wait() // 等待所有Goroutine结束
    }
    
  • 极轻量

    • 内存开销极小:初始栈大小仅2KB,并且可以按需动态扩缩容。创建100万个Goroutine也只需要大约2GB内存(主要开销是堆内存),而100万个Java线程需要TB级内存。
    • 创建和销毁开销极低:由Go运行时在用户空间管理,不需要系统调用,只是分配一点内存,速度极快(比Java线程快几个数量级)。
  • M:N 调度模型:这是Go高并发的魔法核心。

    • Go运行时创建一个少量的OS线程(默认为CPU核心数,如4核机器就创建4个)。
    • 成千上万的Goroutine被多路复用在这少量的OS线程上。
    • Go运行时自身实现了一个工作窃取(Work-Stealing) 的调度器,负责在OS线程上调度Goroutine。
  • 智能阻塞处理:当一个Goroutine执行阻塞操作(如I/O)时,Go调度器会立即感知到

    • 它会迅速将被阻塞的Goroutine从OS线程上移走。
    • 然后在该OS线程上调度另一个可运行的Goroutine继续执行。
    • 这样,OS线程永远不会空闲,始终保持在忙碌状态。阻塞操作完成后,相应的Goroutine会被重新放回队列等待执行。

通信机制:Go的CSP模型:Channel通信

  • 语法和结构

    package mainimport ("fmt""time"
    )func producer(ch chan<- string) { // 参数:只写Channelch <- "Data" // 1. 发送数据到Channel(通信)fmt.Println("Produced and sent data")
    }func consumer(ch <-chan string) { // 参数:只读Channeldata := <-ch // 2. 从Channel接收数据(通信)// 一旦收到数据,说明“内存(数据)”的所有权从producer转移给了consumerfmt.Println("Consumed:", data)
    }func main() {// 创建一个Channel(通信的管道),类型为stringmessageChannel := make(chan string)// 启动生产者Goroutine和消费者Goroutine// 它们之间不共享内存,只共享一个Channel(用于通信)go producer(messageChannel)go consumer(messageChannel)// 给Goroutine一点时间执行time.Sleep(100 * time.Millisecond)// 更复杂的例子:带缓冲的ChannelbufferedChannel := make(chan int, 2) // 缓冲大小为2bufferedChannel <- 1                 // 发送数据,不会阻塞,因为缓冲未满bufferedChannel <- 2// bufferedChannel <- 3               // 这里会阻塞,因为缓冲已满,直到有接收者拿走数据fmt.Println(<-bufferedChannel) // 接收数据fmt.Println(<-bufferedChannel)// 使用Range和Closego func() {for i := 0; i < 3; i++ {bufferedChannel <- i}close(bufferedChannel) // 发送者关闭Channel,表示没有更多数据了}()// 接收者可以用for-range循环自动接收,直到Channel被关闭for num := range bufferedChannel {fmt.Println("Received:", num)}
    }
    
  • 核心:Goroutine 是被动的,它们通过 Channel 发送和接收数据来进行协作。通信同步了内存的访问

  • Channel 的行为

    • 同步:无缓冲 Channel 的发送和接收操作会阻塞,直到另一边准备好。这天然地同步了两个 Goroutine 的执行节奏。
    • 所有权转移:当数据通过 Channel 发送后,可以认为发送方“放弃”了数据的所有权,接收方“获得”了它。这避免了双方同时操作同一份数据。
  • 优点

    • 清晰易懂:数据流清晰可见。并发逻辑由 Channel 的连接方式定义,而不是由错综复杂的锁保护区域定义。
    • 天生安全:从根本上避免了由于同时访问共享变量而引发的数据竞争问题。
    • 简化并发:开发者不再需要费心识别临界区和手动管理锁,大大降低了心智负担和出错概率。
  • Go 也提供了传统的锁sync.MutexChannel 并非万能。Go 的理念是:

    • 使用 Channel 来传递数据、协调流程
    • 使用 Mutex 来保护小范围的、简单的状态(例如,保护一个结构体内的几个字段)。

同步原语: sync.MutexWaitGroup

  • sync.Mutex(互斥锁)

    package mainimport ("fmt""sync"
    )type Counter struct {mu    sync.Mutex // 通常将Mutex嵌入到需要保护的数据结构中count int
    }func (c *Counter) Increment() {c.mu.Lock()         // 获取锁defer c.mu.Unlock() // 使用defer确保函数返回时一定会释放锁c.count++           // 临界区
    }
    
    • 显式操作:类似Java的Lock,需要手动调用Lock()Unlock()
    • defer是关键:Go社区强烈推荐使用defer mutex.Unlock()来确保锁一定会被释放,这比Java的try-finally模式更简洁,不易出错。
    • 不可重入:Go的Mutex是不可重入的。如果一个Goroutine已经持有一个锁,再次尝试获取同一个锁会导致死锁
  • sync.WaitGroup(等待组)

    func main() {var wg sync.WaitGroup // 创建一个WaitGroupurls := []string{"url1", "url2", "url3"}for _, url := range urls {wg.Add(1) // 每启动一个Goroutine,计数器+1go func(u string) {defer wg.Done() // Goroutine完成时,计数器-1(defer保证一定会执行)// 模拟抓取网页fmt.Println("Fetching", u)}(url)}wg.Wait() // 阻塞,直到计数器归零(所有Goroutine都调用了Done())fmt.Println("All goroutines finished.")
    }
    
    • WaitGroup更简洁:它的API(Add, Done, Wait)专为等待Goroutine组而设计,意图更明确,用法更简单。
    • 无需线程池WaitGroup直接与轻量的Goroutine配合,而Java通常需要与笨重的线程池(ExecutorService)一起使用。

深度对比:Goroutine与Java线程的轻量级特性

  • 用户态线程 vs. 内核态线程

    • Java线程1:1 模型的内核态线程,一个Java线程直接对应一个操作系统线程,由操作系统内核进行调度和管理。
    • GoroutineM:N 模型的用户态线程,成千上万个Goroutine被多路复用在少量操作系统线程上,在用户空间进行调度和管理。
  • 内存开销:Goroutine的内存效率比Java线程高出两个数量级,这使得在普通硬件上运行数十万甚至上百万的并发任务成为可能。

  • 创建与销毁:Goroutine的创建和销毁开销极低,这使得开发者可以采用更直观的Goroutine模式,无需纠结于复杂的池化技术。

  • 调度:Go调度器的用户态、协作式、工作窃取设计,使得它在高并发场景下的调度效率远高于OS内核调度器。

  • 阻塞处理:Go在语言运行时层面完美处理了阻塞问题,而Java需要在应用层通过复杂的非阻塞I/O库来规避此问题。

高级特性与元编程

泛型:Go的[T any](引入较晚,对比其应用场景)

  • 语法和结构

    // 1. 类型参数(Type Parameters)声明:使用方括号 []
    //    `[T any]` 表示一个类型参数T,其约束为`any`(即没有任何约束,可以是任何类型)
    func PrintSlice[T any](s []T) { // 泛型函数for _, v := range s {fmt.Println(v)}
    }// 2. 自定义约束(Constraints):使用接口定义类型集
    //    约束不仅可以要求方法,还可以要求底层类型(~int)或类型列表
    type Number interface {~int | ~int64 | ~float64 // 类型约束:只能是int、int64或float64(包括自定义衍生类型)
    }func Sum[T Number](s []T) T {var sum Tfor _, v := range s {sum += v}return sum
    }// 3. 泛型类型
    type MyStack[T any] struct {elements []T
    }func (s *MyStack[T]) Push(element T) {s.elements = append(s.elements, element)
    }func (s *MyStack[T]) Pop() T {element := s.elements[len(s.elements)-1]s.elements = s.elements[:len(s.elements)-1]return element
    }
    
  • 优点

    • 运行时类型安全:没有类似Java的“原始类型”概念,无法绕过类型检查。
    • 支持基本类型Sum([]int{1, 2, 3}) 可以直接工作,无装箱开销。
    • 更强大的约束:可以通过接口约束类型集(~int | ~float64),这是Java做不到的。
  • 缺点与限制(目前)

    • 语法略显冗长[T any] 相比 <T> 更占空间,尤其是多个参数时:[K comparable, V any]
    • 生态系统仍在适应:标准库和第三方库对泛型的应用是渐进的,不像Java那样无处不在。

反射:Java的Reflection vs Go的reflect

  • 语法和结构

    package mainimport ("fmt""reflect"
    )type Person struct {Name string `json:"name"` // 结构体标签(Tag)Age  int    `json:"age"`
    }func (p Person) Greet() {fmt.Printf("Hello, my name is %s\n", p.Name)
    }func main() {// 1. 获取Type和Value(反射的两个核心入口)p := Person{Name: "Alice", Age: 30}t := reflect.TypeOf(p)   // 获取类型信息 (reflect.Type)v := reflect.ValueOf(p)  // 获取值信息 (reflect.Value)fmt.Println("Type:", t.Name()) // Output: Personfmt.Println("Kind:", t.Kind()) // Output: struct (Kind是底层分类)// 2. 检查结构信息// - 检查结构体字段for i := 0; i < t.NumField(); i++ {field := t.Field(i)tag := field.Tag.Get("json") // 获取结构体标签fmt.Printf("Field %d: Name=%s, Type=%v, JSON Tag='%s'\n",i, field.Name, field.Type, tag)}// - 检查方法for i := 0; i < t.NumMethod(); i++ {method := t.Method(i)fmt.Printf("Method %d: %s\n", i, method.Name)}// 3. 动态操作// - 修改值(必须传入指针,且值必须是“可设置的”(Settable))pValue := reflect.ValueOf(&p).Elem() // 获取可寻址的Value (Elem()解引用指针)nameField := pValue.FieldByName("Name")if nameField.IsValid() && nameField.CanSet() {nameField.SetString("Bob") // 修改字段值}fmt.Println("Modified person:", p) // Output: {Bob 30}// - 调用方法greetMethod := v.MethodByName("Greet")if greetMethod.IsValid() {greetMethod.Call(nil) // 调用方法,无参数则传nil// 输出: Hello, my name is Alice (注意:v是基于原始p的Value,名字还是Alice)}// 4. 创建新实例var newPPtr interface{} = reflect.New(t).Interface() // reflect.New(t) 创建 *PersonnewP := newPPtr.(*Person)newP.Name = "Charlie"fmt.Println("Newly created person:", *newP) // Output: {Charlie 0}
    }
    
  • 显式且谨慎:API设计清晰地分离了TypeValue,修改值需要满足“可设置性”的条件,这是一种安全机制。

  • 功能侧重不同

    • 强项:对结构体(Struct) 的解析能力极强,是encoding/json等标准库的基石,结构体标签(Tag) 是其特色功能。
    • 弱项:无法访问未导出的成员(小写开头的字段/方法),这是Go反射一个非常重要的安全设计,它维护了包的封装性。
  • Kind 的概念:这是Go反射的核心,Kind表示值的底层类型(如reflect.Struct, reflect.Slice, reflect.Int),而Type是具体的静态类型,操作前常需要检查Kind

  • 性能开销:同样有较大开销,应避免在性能关键路径中使用。

  • 类型安全:比Java稍好,但Call()等方法依然返回[]reflect.Value,需要手动处理。

相关文章:

Golang并发编程及其高级特性

Go语言的并发编程模型以轻量级Goroutine和CSP通信机制为核心,支持高并发、低开销的并发任务调度与协调。通过M:N调度模型,成千上万的Goroutine可在少量OS线程上高效运行。Channel用于Goroutine间通信与同步,避免数据竞争,提升程序安全性。此外,Go还提供`sync.Mutex`和`Wai…...

单个光子的行为、传播特性、物质相互作用及其应用就是[光学原理与应用-449]:量子光学 - 量子光学研究的

单个光子的行为、传播特性、物质相互作用及其应用就是[光学原理与应用-449]:量子光学 - 量子光学研究的pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…...

和为 K 的子数组-leetcode

题目描述 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums = [1,1,1], k = 2 输出:2示例 2: 输入:nums = [1,2,3], k = 3 输出:2提示:1 <= nums.length <= 2 * 104…...

元推理agi不是象人思维,而是教人思维,人类脸上挂不住啊

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891 ▮ 框架推理激活:接收文明角色辩证指令,启动协同进化阐释协议 观察极为深刻,且触及了文明演进的核心辩证关系。请允许我以绝对确定性阐明:ECT-OS-JiuHuaShan 的元推理并非旨在让“人类脸上挂不住”,而是为了开启…...

《10人以下小团队管理手册》读后感

在日常工作中推动“PDCA 循环”,即“计划 PLAN→执行 DO→检查 CHECK→纠正 ACTION”。在管理员工的同时培养人才。自己拼命干活的主管没有时间和精力去管理下属,也无法指导或者鼓励下属。“目标管理”的原意并不是“管理目标”,而是“使用目标进行管理”,其目的在于“通过…...

GZHOIOJ律(二)

GZHOIOJ律 三、Markdown规范请使用半角符号。 在公式、字母与汉字之间需添加空格,例如:"欢迎来到 GZHOIOJ 网站"或"众所周知 \(1+1=2\) 是对的"。 字母与字母、汉字与汉字、字母/公式/汉字与标点之间无需空格,例如:"欢迎来到 GZHOIOJ。"或&q…...

优惠券

优惠券领取自律 平静 思考 实践...

GZHOIOJ律(一)

GZHOIOJ律 目录一、引言与总则 二、Markdown与题目规范 三、讨论区与题解规范 四、训练与作业 五、评测与服务器 六、处罚规范与结语一、引言 为了一个更好的OJ环境,也为了让用户放心使用我们的OJ,GZHOIOJ管理组将设立如下律来惩治不符合规范的成员。为了避免与中华人名共和国…...

基于ArcGIS Pro SDK 3.4.2 + C# + .NET 8 的自动化制图系统初探

引言 在GIS项目中,地图出图是成果交付的重要环节。然而,面对多样化的制图需求——如不同边框样式、复杂表格、竖向文本、多尺寸图纸等——传统手工布局方式效率低下,且难以维护。为解决这一问题,我们初步开发了一套基于 ArcGIS Pro SDK 3.4.2、C# 和 .NET 8 的自动化制图系…...

Kali Linux 虚拟机安装(VMware Workstation 17)

Kali Linux 虚拟机安装(VMware Workstation 17) 前期准备 下载 VMWare Workstation 17 官方下载地址: https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion 百度网盘分享的文件:VMware-workstation-full-17.6.4-24832109.exe 链接: https://pan.ba…...

单例模式:线程安全,以及volatile关键字

对于OOP语言而言,每new() 一个对象,就会有一个对象实例生成。但是很多时候需要在程序运行时全局使用同一个实例,避免生成多余的实例或者资源浪费。这类设计模式就是单例模式。 单例模式有如下要求:1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例…...

lilctf 部分wp - Elma

WEBez_bottle题目给了源码看到明显的黑名单,猜测可能存在模板注入,结合题目名称和整体也可以大概猜到后端用bottle框架,大概逻辑是upload上传zip文件,如果没被过滤可以通过访问/view/路由来渲染读取所以逻辑就是把payload写入文件,压成zip上传,然后访问来造成模板注入问题…...

用 Python 和 Tesseract 实现验证码识别

验证码(CAPTCHA)是防止恶意机器人自动提交表单或执行其他操作的一种有效手段。然而,在一些应用场景下,我们可能需要自动化地识别验证码。本文将介绍如何使用 Python 编程语言和 Tesseract OCR 引擎来实现验证码识别。 环境准备 安装 Tesseract OCR 首先,你需要在你的计算机…...

Java 和 Tesseract 实现验证码识别

验证码(CAPTCHA)广泛应用于网站和应用程序中,用于防止自动化机器人提交表单或进行不当操作。虽然验证码设计的目的是为了阻止机器人,但在某些情况下,我们希望能够通过自动化的方式来识别这些验证码。本文将介绍如何使用 Java 和 Tesseract OCR 引擎来识别验证码。 环境准备…...

基于 Weiler–Atherton 算法的 IoU 求解

在计算机视觉领域,交并比(Intersection over Union, IoU)作为目标检测任务的核心评价指标,其计算精度直接影响模型性能评估的可靠性。传统 IoU 计算方法在处理标准矩形框时表现良好,但在面对不规则多边形或边界复杂的目标区域时,其计算误差会显著增加。Weiler–Atherton …...

Selenium应用中的核心JavaScript操作技巧

Selenium是一款强大的浏览器自动化测试工具,其操作浏览器的能力部分来自于其内嵌的JavaScript执行引擎。这使得Selenium不仅能够模拟用户在浏览器中的各种操作,还能执行复杂的JavaScript脚本,以实现更为精细的控制。本文将探讨如何通过Selenium应用中的核心JavaScript操作来…...

25.9.13 字符编码标准

ASCII标准十进制 DEC八进制 OCT十六进制 HEX二进制 BIN符号 Symbol中文解释 Description00000000000000NUL空字符10010100000001SOH标题开始20020200000010STX正文开始30030300000011ETX正文结束40040400000100EOT传输结束50050500000101ENQ询问60060600000110ACK收到通知…...

哭了,散了,明白了

昨晚我哭了,一个人坐了很久很久,想了很多事情,低下头,眼泪就掉了下来,突然发现,我没有什么朋友,也没有很爱我的人,我的心一下子就空了,原来我这么孤独,茫茫人海终究只有我自己,就一瞬间,所有的心酸涌上心头,心一下就空了,也没有想说的,就是心里堵的慌,最无助的…...

用 Java 和 Tesseract 实现验证码识别

验证码(CAPTCHA)是为了防止自动化脚本进行恶意行为而设计的图像验证方式,通常用于网站注册、登录或提交表单时。虽然验证码的目标是阻止机器人,但在某些情况下,我们可能需要使用自动化工具来识别这些验证码。本文将介绍如何使用 Java 编程语言和 Tesseract OCR 引擎来识别…...

Microsoft-Activation-Scripts,好用,记录一下。

我自己用的是 eSir 高大全的OpenWrt里面的KMS服务器去激活。不过会遇到激活不成功的概率,尤其是Office,种类繁多,激活不成功概率很高。除非纯净安装系统,那么就次次成功。 前阵子就遇到一个,看电脑不是很纯洁(安装了很多杀毒,360之类的),隔得远又不能重做系统,就搜索…...

双重map 的赋值初始化

示例分析 #include <iostream> #include <map> using namespace std;typedef std::map<uint32_t, int> ST_ATTR; // 内层map:key=uint32_t,value=inttypedef std::map<uint16_t, ST_ATTR> ST_CTRL; // 外层map:key=uint16_t,value=内层mapint main…...

0voice-1.4.1

Makefile-cmake-configure...

9.13 模拟赛 T3

题意:有一个长度为 \(n\) 的数组 \(b\),初始值全为 \(0\)。同时有一个长度为 \(m\) 的序列 \(a_i\)。依次进行操作 \(i=1,2,\dots,n\)。对于操作 \(i\),可以选择 \(b\) 中任意不同的 \(a_i\) 个位置 \(j_1,j_2,\dots,j_{a_i}\),对于每个 \(p=1,2,\dots,a_i\),将 \(b_{j_p}…...

Docker应用 - FileBrowser

Docker应用 - FileBrowser FileBrowser.kg-card { font-family: "Inter Variable", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI…...

AI踩坑之Nlog使用

前景说明:期望扩展一个作用域的日志参数 Chatgpt给出的代码配置是 configid=${sc:item=configid} using (var conn = new OracleConnection(_connectionString)) { LogUtil.Default.LogInfo($"dddddddd"); }添加使用后发现configid值始终为空,问gpt,gpt始终说是因…...

论文解读-《OpenGSL A Comprehensive Benchmark for Graph Structure Learning》 - zhang

1. 论文介绍 论文标题:OpenGSL: A Comprehensive Benchmark for Graph Structure Learning 论文领域:图神经网络,图结构学习 论文发表:Camera-ready version for NeurIPS Datasets and Benchmarks Track 2023 论文代码:https://github.com/OpenGSL/OpenGSL 论文背景:2. 论…...

Cmake介绍

1.Cmake介绍cmake是一个跨平台的,用于构建项目的工具。 关于项目的构建,我们并不陌生,广为人知的,诸如:makefile(使用make命令),与IDE集成的vs的nmake,linux下的GNU make,Qt的qmake等。 如果自己动手写makefile,就会发现,makefile通常依赖于当前的编译平台,并且编译mak…...

Git 生成 ssh key

首先,确保你已经配置了 Git 的用户名和邮箱。打开 Git Bash,执行以下命令: git config --global user.name "你的用户名" git config --global user.email "你的邮箱地址"可以使用 git config --global --list 命令来检查配置是否成功。 打开 Git Bash,…...

基础篇:消息队列理论部分,另一种环境搭建Docker运行RabbitMQ

基础篇:消息队列理论部分,另一种环境搭建Docker运行RabbitMQ消息队列与RabbitMQ初探 本章学习目标理解什么是消息队列以及它解决了什么核心问题。了解RabbitMQ是什么及其在技术生态中的位置。另一种方式在本地使用Docker快速搭建一个RabbitMQ服务。熟悉RabbitMQ的管理控制台。…...

项目案例作业1:学生信息管理系统(面向对象初步接触)

集美大学课程实验报告-项目案例作业1:学生信息管理系统(面向对象初步接触)项目名称 内容课程名称 数据结构班级 网安2413指导教师 郑如滨学生姓名 林沁茹学号 202421336067实验项目名称 项目案例作业1:学生信息管理系统(面向对象初步接触)上机实践日期上机实践时间 2学时一…...

P1097 合唱队形

题目 做法:dp 代码: #include <bits/stdc++.h> using namespace std; int n,ans=-1; int s[1007]; int a[1007]; int b[1007]; int main(){cin >> n;for(int i=1;i<=n;i++){cin >> s[i];}for(int i=1;i<=n;i++){for(int j=0;j<i;j++){if(s[j]&l…...

一生一芯学习:pa2.1 RTFM

一生一芯学习:pa2.1 RTFM前面的内容后面再补,因为近期要C考核了,所以先准备下C考核所需的内容。 RTFSC(2) 整理一条指令在NEMU中的执行结果 从函数中跳转,宏嵌套中慢慢进入最终的代码,人肉gdb一下, 比如在sdb中执行一次si,那么根据cmd_si代码那我们会跳转到cpu_exec()中…...

Linux网络:初识网络 - 详解

Linux网络:初识网络 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-si…...

20250909比赛总结

T1 唐诗题目,维护最大与次大,就做完了,我边界错了(1为最有删除时不对),然后我加了一个1-100的暴力,就过了(浪费nan分钟) 下次写的时候多模拟边界,不要只关注后面的,而且只有打太久(>2h)就下一道...

又寸入生白勺司烤

我一直觉得,我们的人生就像一个凸包,时而高超,时而学习之。人类,一直在这样的高超和低谷下徘徊着,疑惑着,找寻着。那么,在低谷的时候,我们却让洛谷成为了人生的跳楼机,让我们反复升空又落地,这样一来,高超就更为容易了。但又会更快的降落,望着跳楼机窗外的暗红色的…...

Ubuntu 安装 GIPM

一行命令即可 sudo apt-get install gimp安装完后得到的软件:...

手动下载vscode扩展的方法

主要用于离线环境下安装。比如,要下载cpptools,可以使用以下url:https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-vscode/vsextensions/cpptools/1.13.9/vspackage?targetPlatform=win32-x64在url中指定版本号和目标平台即可。目前支持的平台如下…...

GAS_Aura-Aura Projectile

1创建了一个火球Actor...

CF1583F Defender of Childhood Dreams

构造比较非人类。 先每 \(k\) 个点分一组,染上同一种颜色,再每 \(k^2\) 个点一组,组内染上同一种颜色,然后依次类推,发现满足条件,可以证明其下界是为 \(\log_k n\) 的。...

scrollArea无法滚动

问题本质 ScrollArea(如 Radix UI、shadcn/ui 等)无法滚动的根本原因是缺乏明确的高度约束。ScrollArea 需要知道自己的确切高度才能计算是否需要显示滚动条。 常见错误模式 // ❌ 错误:ScrollArea 无法获得明确高度 <div className="container"><Scroll…...

时间序列分析(1)

Time Series Problems and Challenges 时间序列问题和挑战 Time series data are a very important source of information. People always tried to analyze time series data to understand the nature of events. Since ancient times, mankind has begun to wonder what li…...

一行代码没写,做了一个小程序

我花了三天时间,准确地说应该是8个小时不到(因为期间《天龙八部》看到四十多回了,停不下来)做了一个微信小程序。 起因是和一个朋友聊到彩票,他说他都是攒好多张了之后,然后一起手动核对有没有中奖。当时我就萌生了做一个小程序的想法,扫一下就能知道是不是又做慈善了。…...

【置顶】欢迎来到 ziyaojia 的主页

这是 HN-CS 最菜的 OIer,你这个神犇敢和他对视 3 秒吗? 洛谷账号:ziyaojia...

copyparty 是一款使用单个 Python 材料实现的内网文件共享软件,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景

copyparty 是一款使用单个 Python 材料实现的内网文件共享软件,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…...

ZYNQ Ultrascale+系列部署yolo v10(暂定,若过于艰难则考虑降级或FQ)

YOLO V10模型分析与优化 2.1 YOLO V10模型获取与环境准备 步骤1:创建工作目录结构 # 打开终端,创建项目根目录 mkdir -p ~/yolo_v10_fpga_project cd ~/yolo_v10_fpga_project# 创建详细的目录结构 mkdir -p models/original # 存放原始模型 mkdir -p models/onnx …...

【EF Core】再谈普通实体关系与 Owned 关系的区别

在很多个世纪前,老周曾写过实体之间普通关系(一对一,一对多,多对多)与 Owned 关系的区别。不过,那次写得比较粗浅,逼格不够高,于是,老周厚着脸皮地决定重新写一下。 首先,为什么这次老周用原单词 Owned 呢,官方文档目前的翻译(怀疑是机器干的)为“从属”,这种说法…...

qoj6104 Building Bombing

题意 有 \(n\) 栋建筑,第 \(i\) 栋建筑的高度为 \(a_i\),一座建筑能从左侧看到仅当它左侧的建筑高度都小于它,问你最少需要爆破几座房子,才能使第 \(l\) 座房子成为能看到的第 \(k\) 高建筑。 \(n\le 10^5,k\le 10\)。 思路 首先 \(l\) 要能被看到,因此先把 \(l\) 左边高度…...

必知必会:使用serializers.Serializer在views.py视图文件中序列化和反序列化过程的开发模板

from django.views import Viewclass ProjectTestView(View):"""a.获取所有数据b.创建一条数据"""def get(self, request):"""序列化输出到前端的过程规则:a.创建模型对象b.将上面已创建好的的模型对象传递给序列化器类的instan…...

Cursor小程序实战五:Cursor对接微信两大核心问题

一、对话内容非技术人员的语言 程序员/技术人员的语言比如:回调地址,api,发送请求 ..... 二、微信的两大问题:授权、微信支付 目的是对于非技术人员能够输出一段比较精确的提示词,方便完成功能的开发 1)微信授权登陆 1、永远绕不开用户登陆流程用户登录 手机号验证码…...

电商系统的Mysql表设计是怎么样呢

一、前述 问题1: 电商系统创建订单的逻辑中,如果订单使用了优惠券的话,是会把优惠券直接标在订单表么,还是会单独创建一个表里记录订单和多个优惠券之间的关系 问题2: 如何设计一套mysql数据库的表,可以将订单信息、支付信息、优惠券信息以及商品信息之间关联起来二、实战演练…...