- 博客(167)
- 资源 (1)
- 收藏
- 关注
原创 DeepSeek+SpringAI实战AI家庭医生应用 附赠网盘下载地址 48 | 程序性能分析基础(上)
我们这两篇内容讲的是Go程序的性能分析,这其中的内容都是你从事这项任务必备的一些知识和技巧。首先,我们需要知道,与程序性能分析有关的API主要存在于runtime和这几个代码包中。它们可以帮助我们收集相应的性能概要信息,并把这些信息输出到我们指定的地方。Go语言的运行时系统会根据要求对程序的相关指标进行多次采样,并对采样的结果进行组织和整理,最后形成一份完整的性能分析报告。这份报告就是我们一直在说的概要信息的汇总。一般情况下,我们会把概要信息输出到文件。
2025-03-19 16:14:00
872
原创 DeepSeek+SpringAI实战AI家庭医生应用 附赠网盘下载地址 47 | 基于HTTP协议的网络服务
今天,我们主要讲的是基于HTTP协议的网络服务,侧重点仍然在客户端。我们在讨论了http.Get函数和类型的简单使用方式之后,把目光聚焦在了后者的Transport字段。这个字段代表着单次HTTP事务的操作过程。它是接口类型的。它的缺省值由变量代表,其实际类型是。包含的字段非常多。我们先讲了中的字段会被赋予什么样的值,又详细说明了一些关于操作超时的字段。比如和,以及相关的和等等。之后,我又简单地解释了出现空闲连接的原因,以及相关的定制方式。最后,作为扩展,我还为你简要地梳理了类型的。
2025-03-19 16:13:14
796
原创 DeepSeek+SpringAI实战AI家庭医生应用 附赠网盘下载地址 46 | 访问网络服务
我们今天提及了使用Go语言进行网络编程这个主题。作为引子,我先向你介绍了关于socket的一些基础知识。socket常被翻译为套接字,它是一种IPC方法。IPC可以被翻译为进程间通信,它主要定义了多个进程之间相互通信的方法。Socket是IPC方法中最为通用和灵活的一种。与其他的方法不同,利用socket进行通信的进程可以不局限在同一台计算机当中。只要通信的双方能够通过计算机的网卡端口,以及网络进行互联就可以使用socket,无论它们存在于世界上的哪个角落。
2025-03-19 16:12:19
593
原创 DeepSeek+SpringAI实战AI家庭医生应用 附赠网盘下载地址 44 | 使用os包中的API (上)
我们今天讲的是os代码包以及其中的程序实体。我们首先讨论了os包存在的意义,和它的主要用途。代码包中所包含的API,都是对操作系统的某方面功能的高层次抽象,这使得我们可以通过它以统一的方式,操纵不同的操作系统,并得到相似的结果。在这个代码包中,操纵文件系统的API最为丰富,最有代表性的就是数据类型os.File。os.File类型不但可以代表操作系统中的文件,还可以代表很多其他的东西。尤其是在类Unix的操作系统中,它几乎可以代表一切可以操纵的软件和硬件。
2025-03-19 16:11:05
768
原创 DeepSeek+SpringAI实战AI家庭医生应用 附赠网盘下载地址
我用夸克网盘分享了「DeepSeek+SpringAI实战AI家庭医生应用-完结。点击链接即可保存链接:https://pan.quark.cn/s/d3cbd41ad4b3点击链接即可加入夸克IT资源网盘群:https://pan.quark.cn/g/f233c5028d备用地址:最新夸克共享群:https://link3.cc/cowcowit今天,我们来讲另一个与I/O操作强相关的代码包bufio。bufio是“buffered I/O”的缩写。
2025-03-19 16:08:40
698
原创 Go语言核心基础之 40 | io包中的接口和工具 (上)
我们今天一直在讨论和梳理io代码包中的程序实体,尤其是那些重要的接口及其实现类型。io包中的接口对于Go语言的标准库和很多第三方库而言,都起着举足轻重的作用。其中最核心的io.Reader接口和io.Writer接口,是很多接口的扩展对象或设计源泉。我们下一节会继续讲解io包中的接口内容。你用过哪些io包中的接口和工具呢,又有哪些收获和感受呢,你可以给我留言,我们一起讨论。[戳此查看Go语言专栏文章配套详细代码。](
2025-03-19 16:04:34
491
原创 Go语言核心基础之32 | context.Context类型
我们今天主要讨论的是context包中的函数和Context类型。该包中的函数都是用于产生新的Context类型值的。Context类型是一个可以帮助我们实现多goroutine协作流程的同步工具。不但如此,我们还可以通过此类型的值传达撤销信号或传递数据。Context类型的实际值大体上分为三种,即:根Context值、可撤销的Context值和含数据的Context值。所有的Context值共同构成了一颗上下文树。这棵树的作用域是全局的,而根Context值就是这棵树的根。
2025-03-19 15:59:38
825
原创 Go语言核心基础之31 | sync.WaitGroup和sync.Once
sync代码包的WaitGroup类型和Once类型都是非常易用的同步工具。它们都是开箱即用和并发安全的。利用WaitGroup值,我们可以很方便地实现一对多的goroutine协作流程,即:一个分发子任务的goroutine,和多个执行子任务的goroutine,共同来完成一个较大的任务。在使用WaitGroup值的时候,我们一定要注意,千万不要让其中的计数器的值小于0,否则就会引发panic。另外,我们最好用“先统一Add,再并发Done,最后Wait”这种标准方式,来使用WaitGroup值。
2025-03-19 15:57:32
883
原创 Go语言核心基础之30 | 原子操作(下)
我们把这两篇文章一起总结一下。相对于原子操作函数,原子值类型的优势很明显,但它的使用规则也更多一些。首先,在首次真正使用后,原子值就不应该再被复制了。其次,原子值的Store方法对其参数值(也就是被存储值)有两个强制的约束。一个约束是,参数值不能为nil。另一个约束是,参数值的类型不能与首个被存储值的类型不同。也就是说,一旦一个原子值存储了某个类型的值,那它以后就只能存储这个类型的值了。
2025-03-19 15:54:53
847
原创 Go语言核心基础之 24 | 测试的基本规则和流程(下)
注意,对于功能测试和性能测试,命令执行测试流程的方式会有些不同。另外一个重要的问题是,我们在与go test命令交互时,怎样解读它提供给我们的信息。只有解读正确,你才能知道测试的成功与否,失败的具体原因以及严重程度等等。除此之外,对于性能测试,你还需要关注命令输出的计算资源使用提示,以及各种性能度量。这两篇的文章中,我们一起学习了不少东西,但是其实还不够。我们只是探讨了go test命令以及testing包的基本使用方式。在下一篇,我们还会讨论更高级的内容。这将涉及go test命令的各种标记、
2025-03-09 15:22:37
823
原创 Go语言核心基础之23 | 测试的基本规则和流程 (上)
在本篇文章的一开始,我就试图向你阐释程序测试的重要性。在我经历的公司中起码有一半都不重视程序测试,或者说没有精力去做程序测试。尤其是中小型的公司,他们往往完全依靠软件质量保障团队,甚至真正的用户去帮他们测试。在这些情况下,软件错误或缺陷的发现、反馈和修复的周期通常会很长,成本也会很大,也许还会造成很不好的影响。Go语言是一门很重视程序测试的编程语言,它不但自带了testing包,还有专用于程序测试的命令go test。我们要想真正用好一个工具,就需要先了解它的核心逻辑。
2025-03-09 15:21:51
877
原创 Go语言核心基础之22 | panic函数、recover函数以及defer语句(下)
我们这两期的内容主要讲了两个函数和一条语句。recover函数专用于恢复panic,并且调用即恢复。它在被调用时会返回一个空接口类型的结果值。如果在调用它时并没有panic发生,那么这个结果值就会是nil。而如果被恢复的panic是我们通过调用panic函数引发的,那么它返回的结果值就会是我们传给panic函数参数值的副本。对recover函数的调用只有在defer语句中才能真正起作用。defer语句是被用来延迟执行代码的。更确切地说,它会让其携带的defer函数的调用延迟执行,并且会延迟到该。
2025-03-09 15:21:13
586
原创 Go语言核心基础之21 | panic函数、recover函数以及defer语句 (上)
最近的两篇文章,我们是围绕着panic函数、recover函数以及defer语句进行的。今天我主要讲了panic函数。这个函数是专门被用来引发panic的。panic也可以被称为运行时恐慌,它是一种只能在程序运行期间抛出的程序异常。Go语言的运行时系统可能会在程序出现严重错误时自动地抛出panic,我们在需要时也可以通过调用panic函数引发panic。但不论怎样,如果不加以处理,panic就会导致程序崩溃并终止运行。
2025-03-09 15:20:33
775
原创 Go语言核心基础之20 | 错误处理 (下)
今天,我从两个视角为你总结了错误类型、错误值的处理技巧和设计方式。我们先一起看了一下Go语言中处理错误的最基本方式,这涉及了函数结果列表设计、
2025-03-09 15:19:57
716
原创 Go语言核心基础之19 | 错误处理(上)
今天我们一起初步学习了错误处理的内容。我们总结了错误类型、错误值的处理技巧和设计方式,并一起分享了Go语言中处理错误的最基本方式。由于错误处理的内容分为上下两篇,在下一次的文章中,我们会站在建造者的角度,一起来探索一下:怎样根据实际情况给予恰当的错误值。
2025-03-09 15:19:17
974
原创 Go语言核心基础之17 | go语句及其执行规则(下)
在本篇文章中,我们接着上一篇文章的主问题,讨论了当我们想让运行结果更加可控的时候,应该怎样去做。主goroutine的运行若过早结束,那么我们的并发程序的功能就很可能无法全部完成。所以我们往往需要通过一些手段去进行干涉,比如调用。
2025-03-09 15:18:00
521
原创 Go语言核心基础之16 | go语句及其执行规则(上)
今天,我描述了goroutine在操作系统的并发编程体系,以及在Go语言并发编程模型中的地位和作用。这些知识点会为你打下一个坚实的基础。我还提到了Go语言内部的运行时系统和调度器,以及它们围绕着goroutine做的那些统筹调配和维护工作。这些内容中的每句话应该都会对你正确理解goroutine起到实质性的作用。你可以用这些知识去解释主问题中的那个程序在运行后为什么会产出那样的结果。
2025-03-09 15:17:18
1004
原创 Go语言核心基础之 15 | 关于指针的有限操作
我们今天集中说了说与指针有关的问题。基于基本类型的指针值应该是我们最常用到的,也是我们最需要关注的,比如*Dog类型的值。怎样得到一个这样的指针值呢?这需要用到取址操作和操作符。不过这里还有个前提,那就是取址操作的操作对象必须是可寻址的。关于这方面你需要记住三个关键词:不可变的、临时结果和不安全的。只要一个值符合了这三个关键词中的任何一个,它就是不可寻址的。但有一个例外,对切片字面量的索引结果值是可寻址的。那么不可寻址的值在使用上有哪些限制呢?
2025-03-09 15:16:34
968
原创 Go语言核心基础之14 | 接口类型的合理运用
好了,我们来简要总结一下。Go语言的接口常用于代表某种能力或某类特征。首先,我们要弄清楚的是,接口变量的动态值、动态类型和静态类型都代表了什么。这些都是正确使用接口变量的基础。当我们给接口变量赋值时,接口变量会持有被赋予值的副本,而不是它本身。更重要的是,接口变量的值并不等同于这个可被称为动态值的副本。它会包含两个指针,一个指针指向动态值,一个指针指向类型信息。基于此,即使我们把一个值为。
2025-03-09 15:14:48
955
原创 Go语言核心基础之12 | 使用函数的正确姿势
我们今天主要聚焦于函数的使用手法。在Go语言中,函数可是一等的(first-class)公民。它既可以被独立声明,也可以被作为普通的值来传递或赋予变量。除此之外,我们还可以在其他函数的内部声明匿名函数并把它直接赋给变量。你需要记住Go语言是怎样鉴别一个函数的,函数的签名在这里起到了至关重要的作用。函数是Go语言支持函数式编程的主要体现。我们可以通过“把函数传给函数”以及“让函数返回函数”来编写高阶函数,也可以用高阶函数来实现闭包,并以此做到部分程序逻辑的动态生成。
2025-03-07 21:46:40
549
原创 Go语言核心基础之11 | 通道的高级玩法
仅当最上边的候选分支中的所有表达式都被求值完毕后,从上边数第二个候选分支中的表达式才会被求值,顺序同样是从左到右,然后是第三个候选分支、第四个候选分支,以此类推。表达式是包含了接收表达式的短变量声明时,那么在赋值符号左边的就可以是一个或两个表达式,不过此处的表达式的结果必须是可以被赋值的。表达式,都至少会包含一个代表发送操作的发送表达式或者一个代表接收操作的接收表达式,同时也可能会包含其他的表达式。如果我们把它用在通道的类型字面量中,那么它代表的就不是“发送”或“接收”的动作了,而是表示通道的方向。
2025-03-07 21:39:55
817
原创 Go语言核心基础之10 | 通道的基本操作
今天我们讲到了通道的一些常规操作,包括初始化、发送、接收和关闭。通道类型是Go语言特有的,所以你一开始肯定会感到陌生,其中的一些规则和奥妙还需要你铭记于心,并细心体会。首先是在初始化通道时设定其容量的意义,这有时会让通道拥有不同的行为模式。对通道的发送操作和接收操作都有哪些基本特性,也是我们必须清楚的。这涉及了它们什么时候会互斥,什么时候会造成阻塞,什么时候会引起panic,以及它们收发元素值的顺序是怎样的,它们是怎样保证元素值的完整性的,元素值通常会被复制几次,等等。
2025-03-07 21:39:04
752
原创 Go语言核心基础之09 | 字典的操作和约束
我们这次主要讨论了与字典类型有关的,一些容易让人困惑的问题。比如,为什么字典的键类型会受到约束?又比如,我们通常应该选取什么样的类型作为字典的键类型。我以Go语言规范为起始,并以Go语言源码为依据回答了这些问题。认真看了这篇文章之后,你应该对字典中的映射过程有了一定的理解。另外,对于Go语言在那些合法的键类型上所做的求哈希和判等的操作,你也应该有所了解了。再次强调,永远要注意那些可能引发panic的操作,比如像一个值为。
2025-03-07 21:38:06
590
原创 Go语言核心基础之07 | 数组和切片
总结一下,我们今天一起探讨了数组和切片以及它们之间的关系。切片是基于数组的,可变长的,并且非常轻快。一个切片的容量总是固定的,而且一个切片也只会与某一个底层数组绑定在一起。此外,切片的容量总会是在切片长度和底层数组长度之间的某一个值,并且还与切片窗口最左边对应的元素在底层数组中的位置有关系。那两个分别用减法计算切片长度和容量的方法你一定要记住。另外,如果新的长度比原有切片的容量还要大,那么底层数组就一定会是新的,而且。
2025-03-07 21:36:29
434
原创 Go语言核心基础之 06 | 程序实体的那些事儿 (下)
在本篇文章中,我们聚焦于类型。Go语言中的每个变量都是有类型的,我们可以使用类型断言表达式判断变量是哪个类型的。正确使用该表达式需要一些小技巧,比如总是应该把结果赋给两个变量。另外还要保证被判断的变量是接口类型的,这可能会用到类型转换表达式。我们在使用类型转换表达式对变量的类型进行转换的时候,会受到一套规则的严格约束。我们必须关注这套规则中的一些细节,尤其是那些Go语言命令不会帮你检查的细节,否则就会踩进所谓的“陷阱”中。
2025-03-07 21:35:45
794
原创 Go语言核心基础之05 | 程序实体的那些事儿(中)
我们先讨论了代码块,并且也谈到了它与程序实体的作用域,以及访问权限控制之间的巧妙关系。Go语言本身对程序实体提供了相对粗粒度的访问控制。但我们自己可以利用代码块和作用域精细化控制它们。如果在具有嵌套关系的不同代码块中存在重名的变量,那么我们应该特别小心,它们之间可能会发生“屏蔽”的现象。这样你在不同代码块中引用到变量很可能是不同的。具体的鉴别方式需要参考Go语言查找(代表了程序实体的)标识符的过程。另外,请记住变量重声明与可重名变量之间的区别以及它们的重要特征。
2025-03-07 19:45:19
953
原创 Go语言核心基础之04 | 程序实体的那些事儿(上)
如果只用一两句话回答这个问题的话,我想可以是这样的:Go语言的类型推断可以明显提升程序的灵活性,使得代码重构变得更加容易,同时又不会给代码的维护带来额外负担(实际上,它恰恰可以避免散弹式的代码修改),更不会损失程序的运行效率。在Go语言中,变量的类型可以是其预定义的那些类型,也可以是程序自定义的函数、结构体或接口。Go语言是静态类型的编程语言,所以我们在声明变量或常量的时候,都需要指定它们的类型,或者给予足够的信息,这样才可以让Go语言能够推导出它们的类型。变量的重声明只可能发生在某一个代码块中。
2025-03-07 19:44:40
778
原创 Go语言核心基础之03 | 库源码文件
我们在本篇文章中详细讨论了把代码从命令源码文件中拆分出来的方法,这包括拆分到其他库源码文件,以及拆分到其他代码包。这里涉及了几条重要的Go语言基本编码规则,即:代码包声明规则、代码包导入规则以及程序实体的访问权限规则。在进行模块化编程时,你必须记住这些规则,否则你的代码很可能无法通过编译。
2025-03-07 19:43:34
883
原创 Go语言核心基础之 02 | 命令源码文件
这有很多种方式,最简单的一种方式就是对变量flag.Usage重新赋值。flag.Usage的类型是func(),即一种无参数声明且无结果声明的函数类型。flag.Usage变量在声明时就已经被赋值了,所以我们才能够在运行命令时看到正确的结果。注意,对flag.Usage的赋值必须在调用flag.Parse函数之前。现在,我们把demo2.go另存为demo3.go,然后在main函数体的开始处加入如下代码。那么当运行后,就会看到现在再深入一层,我们在调用flag包中的一些函数(比如StringVar。
2025-03-07 19:42:28
619
原创 Go语言核心基础之 01 | 工作区和GOPATH
工作区和GOPATH的概念和含义是每个Go工程师都需要了解的。虽然它们都比较简单,但是说它们是Go程序开发的核心知识并不为过。然而,我在招聘面试的过程中仍然发现有人忽略掉了它们。Go语言提供的很多工具都是在GOPATH和工作区的基础上运行的,比如上面提到的go buildgo install和go get,这三个命令也是我们最常用到的。
2025-03-07 19:41:17
906
原创 Java核心技术面试精讲第39讲 | 谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
专栏的绝大部分主题都侧重于Java语言和虚拟机,基本都是单机模式下的问题,今天我会补充一个分布式相关的问题。严格来说,分布式并不算是Java领域,而是一个单独的大主题,但确实也会在Java技术岗位面试中被涉及。在准备面试时,如果有丰富的分布式系统经验当然好;如果没有,你可以选择典型问题和基础技术进行适当准备。关于分布式,我自身的实战经验也非常有限,专栏里就谈谈从理论出发的一些思考。今天我要问你的问题是,谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
2025-03-06 17:20:42
756
原创 Java核心技术面试精讲 第38讲 | 对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?
今天我会对NIO进行一些补充,在中,我们初步接触了Java提供的几种IO机制,作为语言基础类库,Java自身的NIO设计更偏底层,这本无可厚非,但是对于一线的应用开发者,其复杂性、扩展性等方面,就存在一定的局限了。在基础NIO之上,Netty构建了更加易用、高性能的网络框架,广泛应用于互联网、游戏、电信等各种领域。今天我要问你的问题是,对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?
2025-03-06 17:19:45
639
原创 Java核心技术面试精讲 第37讲 | 谈谈Spring Bean的生命周期和作用域?
在企业应用软件开发中,Java是毫无争议的主流语言,开放的Java EE规范和强大的开源框架功不可没,其中Spring毫无疑问已经成为企业软件开发的事实标准之一。今天这一讲,我将补充Spring相关的典型面试问题,并谈谈其部分设计细节。今天我要问你的问题是,谈谈Spring Bean的生命周期和作用域?
2025-03-06 17:19:05
598
原创 Java核心技术面试精讲 第36讲 | 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
在日常开发中,尤其是业务开发,少不了利用Java对数据库进行基本的增删改查等数据操作,这也是Java工程师的必备技能之一。做好数据操作,不仅仅需要对Java语言相关框架的掌握,更需要对各种数据库自身体系结构的理解。今天这一讲,作为补充Java面试考察知识点的完整性,关于数据库的应用和细节还需要在实践中深入学习。今天我要问你的问题是,谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
2025-03-06 17:18:27
862
原创 Java核心技术面试精讲 第35讲 | JVM优化Java代码时都做了什么?
我在专栏上一讲介绍了微基准测试和相关的注意事项,其核心就是避免JVM运行中对Java代码的优化导致失真。所以,系统地理解Java代码运行过程,有利于在实践中进行更进一步的调优。今天我要问你的问题是,JVM优化Java代码时都做了什么?与以往我来给出典型回答的方式不同,今天我邀请了隔壁专栏的作者,同样是来自Oracle的郑雨迪博士,让他以JVM专家的身份去思考并回答这个问题。
2025-03-06 17:17:45
946
原创 Java核心技术面试精讲 第34讲 | 有人说“Lambda能让Java程序慢30倍”,你怎么看?
在上一讲中,我介绍了Java性能问题分析的一些基本思路。但在实际工作中,我们不能仅仅等待性能出现问题再去试图解决,而是需要定量的、可对比的方法,去评估Java应用性能,来判断其是否能够符合业务支撑目标。今天这一讲,我会介绍从Java开发者角度,如何从代码级别判断应用的性能表现,重点理解最广泛使用的基准测试(Benchmark)。今天我要问你的问题是,有人说“Lambda能让Java程序慢30倍”,你怎么看?为了让你清楚地了解这个背景,请参考下面的代码片段。
2025-03-06 17:17:08
662
《已调试》springboot layui 装修验收管理系统(源码+sql).zip
2025-03-05
《已调试》java Springboot网上音乐商城(源码+sql+论文)
2025-03-05
《已调试》Java SpringBoot个人理财系统(源码+sql)
2025-03-05
价值上万的视频教程互联网程序开发+大数据+Hadoop、hive、Spark
2022-06-08
IT资源共享群一起分享资源
2025-03-07
TA创建的收藏夹 TA关注的收藏夹
TA关注的人