为何每个开发者都在谈论Go?

news2024/11/25 2:23:40

目录

  • 一、引言
    • Go的历史回顾
      • 关键时间节点
    • 使用场景
    • Go的语言地位
      • 技术社群与企业支持
      • 资源投入和生态系统
  • 二、简洁的语法结构
    • 基本组成元素
      • 变量声明与初始化
      • 代码示例
    • 类型推断
    • 函数与返回值
      • 代码示例
        • 输出
    • 接口与结构体:组合而非继承
    • 错误处理:明确而不是异常
    • 小结
  • 三、并发支持
    • Goroutines:轻量级线程
      • 基本用法
      • 代码示例
        • 输出
    • Channels:并发安全的数据交流
      • 基本用法
      • 代码示例
        • 输出
    • Select:多路复用
    • 内存模型和同步原语
    • 小结
  • 四、性能优势
    • 高效的编译器
      • 代码示例:编译时间
    • 运行时性能
      • Goroutine调度
    • 垃圾回收与内存管理
      • 代码示例:内存分配
    • 内置的性能分析工具
    • 小结
  • 五、生态系统和社群
    • 包管理和模块化
      • Go Modules
    • 标准库
      • 代码示例:HTTP服务器
    • 开源生态
    • 社群和会议
      • GopherCon
    • 小结
  • 六、Go在云原生领域的应用
    • 容器化和微服务
      • 代码示例:Dockerfile
    • Kubernetes与云原生编排
      • 代码示例:Kubernetes Client-Go
    • Go在服务网格中的应用
      • 代码示例:使用Istio进行流量控制
    • Serverless和FaaS
    • 小结
  • 七、可移植性和跨平台支持
    • 编译器的跨平台特性
      • 跨平台编译
    • 标准库的跨平台支持
      • 代码示例:文件操作
    • 体积小、依赖少
    • C语言交互
      • 代码示例:cgo
    • 小结
  • 八、总结

本文深入探讨了Go语言的多个关键方面,从其简洁的语法、强大的并发支持到出色的性能优势,进一步解析了Go在云原生领域的显著应用和广泛的跨平台支持。文章结构严谨,逐一分析了Go语言在现代软件开发中所占据的重要地位和其背后的技术原理。

关注TechLeadCloud,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

file

一、引言

Go的历史回顾

file
Go语言(通常被称为Go或Golang)由Robert Griesemer、Rob Pike和Ken Thompson在2007年开始设计,并于2009年正式公开发布。这三位设计者都曾在贝尔实验室工作,拥有丰富的编程语言和操作系统研究经验。Go的诞生最初是为了解决Google内部的软件工程问题,特别是服务端软件的开发。

设计Go的主要目标包括:

  • 简化现代软件复杂性
  • 提高开发和编译速度
  • 天然支持并发和网络编程
  • 可移植性和跨平台支持

关键时间节点

file
file

  • 2009年:Go语言首次公开发布。
  • 2011年:Go版本1(Go1)发布,确立了API和主要规范。
  • 2015年:Docker和Kubernetes等开源项目开始广泛采用Go,加速了其在工业界的普及。

使用场景

file
Go语言主要在以下场景中得到广泛应用:

  • 后端开发:高性能API和微服务
  • 云原生应用:如Docker和Kubernetes
  • 网络编程:TCP/HTTP服务器、网络代理等
  • 数据处理和分析:日志分析、数据抓取等
  • 命令行工具:如Git操作工具、系统监控工具等
  • 嵌入式系统和物联网

Go的语言地位

从RedMonk编程语言排名和Stack Overflow开发者调查来看,Go一直稳居前十强。特别值得注意的是,Go在服务端开发和云原生领域已经成为一门不可或缺的语言。

技术社群与企业支持

Go拥有活跃的社群和强大的企业支持,不仅包括Google,还有IBM、Microsoft、Dropbox等多个大型企业都在内部广泛使用Go。Go也有丰富的第三方库和框架,为开发者提供了强大的工具和资源。

资源投入和生态系统

Go拥有一个庞大和快速发展的生态系统,包括丰富的库、开发工具以及成熟的框架。这使得Go不仅仅是一门编程语言,更是一种解决问题和实现目标的全面工具集。


二、简洁的语法结构

Go语言是以简洁、明确和可维护为设计目标的。简洁的语法不仅让新手容易上手,也允许开发团队更加高效地进行大规模开发。

基本组成元素

Go语言的基本组成元素包括变量、常量、函数和控制结构等,但与其他语言相比,Go具有自己独特的简洁风格。

变量声明与初始化

Go语言在变量声明和初始化方面提供了多种简洁的方式。

// 常见的变量声明与初始化
var i int = 10
var j = 20
k := 30

代码示例

// 声明并初始化多个变量
var a, b, c = 1, 2.0, "three"
x, y, z := 4, 5.0, "six"

类型推断

Go编译器能进行强大的类型推断,这避免了冗余的类型声明。

var message = "Hello, World!"  // 类型推断为string
count := 42  // 类型推断为int

函数与返回值

Go的函数可以返回多个值,并且支持命名返回值。

// 函数返回多个值
func swap(x, y string) (string, string) {
    return y, x
}

代码示例

// 带命名返回值的函数
func divide(dividend, divisor int) (quotient, remainder int) {
    quotient = dividend / divisor
    remainder = dividend % divisor
    return
}
输出

使用这个divide函数,例如divide(5, 2)将会返回(2, 1)

接口与结构体:组合而非继承

Go通过结构体(Structs)和接口(Interfaces)提供了强大的抽象机制,但它避免了像Java那样复杂的继承结构。

type Shape interface {
    Area() float64
}

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14159 * c.Radius * c.Radius
}

这里,Circle结构体实现了Shape接口,而没有显式声明。这种隐式接口实现减少了代码量,并提高了代码的可读性和可维护性。

错误处理:明确而不是异常

Go通过返回值进行错误处理,而非使用异常。这一点让代码的错误处理路径更加明确,易于理解。

if err != nil {
    // handle error
}

小结

Go语言通过其简洁而一致的语法结构,大大减少了编程的复杂性。不仅如此,它还通过类型推断、多返回值、接口和错误处理等机制,提供了高度的表达能力。


三、并发支持

Go语言对并发编程提供了一流的支持,这是它与其他编程语言最显著的不同之一。Go使用Goroutines和Channels来简化并发编程,并通过其运行时系统提供对低级并发控制的抽象。
file

Goroutines:轻量级线程

file
Goroutines是Go语言并发模型的核心。它们比操作系统线程更为轻量级,因为它们共享同一地址空间。

基本用法

go funcName(params)

简单地在函数调用前加上go关键字,你就创建了一个新的Goroutine。

代码示例

// 使用goroutine执行异步任务
func printNumbers() {
    for i := 0; i < 10; i++ {
        fmt.Println(i)
    }
}

func main() {
    go printNumbers()
    // do something else
}
输出

因为printNumbers是在一个新的Goroutine中运行,主函数main会与之并行执行。

Channels:并发安全的数据交流

Channel是Go中用于Goroutine间数据传输和同步的主要手段。

基本用法

ch := make(chan int)

代码示例

// 使用channel进行数据传输
func sum(a []int, ch chan int) {
    sum := 0
    for _, v := range a {
        sum += v
    }
    ch <- sum  // send sum to ch
}

func main() {
    a := []int{7, 2, 8, -9, 4, 0}
    ch := make(chan int)
    go sum(a[:len(a)/2], ch)
    go sum(a[len(a)/2:], ch)
    x, y := <-ch, <-ch  // receive from ch
    fmt.Println(x + y)
}
输出

该程序输出的是a切片中所有元素的和。

Select:多路复用

Go提供了select语句,它是一个强大的用于多个Channel操作的多路复用器。

select {
case msg1 := <-ch1:
    fmt.Println("Received", msg1)
case msg2 := <-ch2:
    fmt.Println("Received", msg2)
case ch3 <- 3:
    fmt.Println("Sent 3 to ch3")
default:
    fmt.Println("No communication")
}

这使得你可以同时等待多个Channel操作,只执行其中已准备好的那个。

内存模型和同步原语

Go也提供了传统的同步原语,如互斥锁(Mutex)和读写锁(RWMutex),但在实际开发中,优先推荐使用Channels进行并发控制。

小结

Go的并发模型主要围绕Goroutines和Channels展开,它们共同提供了一种高效、强大而安全的方式来进行并发编程。通过深入了解Go语言的并发模型,开发者可以构建高度并发的系统,而不必陷入复杂和容易出错的并发控制中。这也是Go语言在现代多核和分布式系统中日益流行的一个重要原因。


四、性能优势

Go语言不仅在语法和并发模型上具有优势,其性能也是其备受赞誉的一大特点。这一章节将深入探讨Go语言在性能方面的特性和优势。

高效的编译器

Go的编译器是为快速编译速度而设计的,这意味着你可以更快地从源代码到可执行文件。

代码示例:编译时间

time go build your_program.go

通过运行这个命令,你会发现Go编译器的速度通常要比其他编程语言快得多。

运行时性能

Go运行时极其高效,这主要得益于其轻量级的Goroutine和垃圾回收机制。

Goroutine调度

Go运行时有自己的调度器,它能在用户级别上进行Goroutine的调度,降低上下文切换的成本。

// 计算斐波那契数列
func Fibonacci(n int) int {
    if n < 2 {
        return n
    }
    return Fibonacci(n-1) + Fibonacci(n-2)
}

由于Go的运行时调度,这样的CPU密集型任务可以轻松地并发执行。

垃圾回收与内存管理

Go使用了一种并发垃圾回收算法,这大大减少了垃圾回收对性能的影响。

代码示例:内存分配

// 创建一个结构体实例
type Data struct {
    X int
    Y float64
    Text string
}

instance := &Data{
    X:    1,
    Y:    3.14,
    Text: "Text",
}

由于Go的高效内存管理,这样的操作通常会比在其他语言中更快。

内置的性能分析工具

Go提供了一系列性能分析工具,如pprof,使得开发者可以深入了解代码的性能瓶颈。

import _ "net/http/pprof"

添加这一行,然后你就可以通过Web界面来进行实时的性能分析。

小结

Go语言在编译速度、运行时性能和内存管理方面都表现出色,这使得它非常适用于需要高性能的应用场景,如微服务、并发处理、数据处理等。通过了解Go语言在性能方面的优势,开发者可以更好地利用这些优点来构建高效、可扩展的系统。这也是为什么许多高性能需求的项目和公司选择Go作为他们的开发语言的原因之一。


五、生态系统和社群

file
除了语言特性和性能优势之外,一个编程语言的成功与否也高度依赖于其生态系统和社群的活跃度。Go在这方面有着不小的优势,本节将深入探讨Go的生态系统和社群。

包管理和模块化

Go语言从一开始就考虑到了包管理和代码复用。Go的包管理工具go get和Go Modules为开发者提供了一个高效、直观的方式来管理依赖。

Go Modules

Go Modules是Go 1.11版引入的,用于依赖管理的官方解决方案。

go mod init
go get github.com/pkg/errors

通过简单的命令,开发者就能初始化一个新项目并添加依赖。

标准库

Go的标准库覆盖了网络编程、数据解析、文本处理等多个领域,大大降低了开发者需要依赖第三方库的需求。

代码示例:HTTP服务器

// 创建一个简单的HTTP服务器
package main

import (
    "fmt"
    "net/http"
)

func hello(w http.ResponseWriter, req *http.Request) {
    fmt.Fprintf(w, "Hello, world!\n")
}

func main() {
    http.HandleFunc("/hello", hello)
    http.ListenAndServe(":8080", nil)
}

这个例子展示了如何使用Go标准库中的net/http包来创建一个HTTP服务器。

开源生态

Go拥有一个庞大的开源社群,GitHub上有大量的优质Go项目,如Kubernetes、Etcd和Terraform等。

社群和会议

Go社群活跃,拥有多个论坛、在线聊天室以及国际性和地方性的会议,如GopherCon。

GopherCon

GopherCon是Go开发者的年度聚会,汇集了世界各地的Go使用者,共同讨论Go的最佳实践和未来发展。

小结

Go的生态系统由高质量的包管理工具、全面的标准库、活跃的开源社群和丰富的学习资源组成。这一切都为开发者提供了良好的支持,有助于推动Go语言的快速发展和广泛应用。生态系统和社群是衡量一个编程语言健康状况的重要标准,Go在这方面的表现证明了它不仅仅是一门有潜力的新语言,更是一个成熟、可靠、拥有广泛应用前景的编程平台。


六、Go在云原生领域的应用

file
云原生领域的飞速发展也带动了Go语言的广泛应用。作为云原生技术的主力军之一,Go因其高性能、简洁的语法以及丰富的标准库,逐渐成为该领域的首选语言。本节将深入探讨Go在云原生应用开发中的关键角色和优势。

容器化和微服务

Go语言的高效编译和轻量级的运行环境使其非常适合构建容器化应用和微服务。

代码示例:Dockerfile

# 使用Go官方基础镜像
FROM golang:1.16
# 设置工作目录
WORKDIR /app
# 将Go模块复制到容器中
COPY go.mod ./
COPY go.sum ./
# 下载所有依赖
RUN go mod download
# 将源代码复制到容器中
COPY . .
# 编译应用
RUN go build -o main .
# 运行应用
CMD ["/app/main"]

这个简单的Dockerfile示例展示了如何容器化一个Go应用。

Kubernetes与云原生编排

Kubernetes是由Google设计并开源的容器编排平台,其底层主要是用Go语言编写的。

代码示例:Kubernetes Client-Go

import (
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

// 初始化Kubernetes客户端
config, err := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig")
clientset, err := kubernetes.NewForConfig(config)

这段代码展示了如何使用Kubernetes的Go客户端库进行集群操作。

Go在服务网格中的应用

Istio和Linkerd等主流服务网格项目也是用Go实现的,它们提供了复杂的流量管理、安全性和观测性能力。

代码示例:使用Istio进行流量控制

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1

虽然这不是Go代码,但Istio的YAML配置文件控制着用Go编写的服务网格行为。

Serverless和FaaS

Go也在Serverless和FaaS(Function as a Service)领域取得了不小的成功,AWS Lambda、Google Cloud Functions等平台都提供了Go的一流支持。

小结

Go语言因其出色的性能和可扩展性,已经在云原生应用开发领域占据了一席之地。从容器编排到服务网格,再到无服务器架构,Go都有着广泛的应用场景。Go在云原生领域的广泛应用不仅证明了其作为一种现代编程语言的能力,更凸显了其在处理高并发、分布式、微服务架构等复杂场景下的优越性。因此,对于希望深入了解云原生应用开发的人来说,学习和掌握Go几乎成了一种必然。


七、可移植性和跨平台支持

Go语言在设计之初就强调了跨平台支持和高度的可移植性,这也是其逐渐受到开发者喜爱的一个重要原因。本节将详细解析Go在这方面的技术优势和应用场景。

编译器的跨平台特性

Go的编译器(gc)支持多种操作系统和架构。通过简单的环境变量或命令行参数,你可以轻易地为不同平台生成可执行文件。

跨平台编译

# 为Linux平台编译
GOOS=linux GOARCH=amd64 go build -o app-linux
# 为Windows平台编译
GOOS=windows GOARCH=amd64 go build -o app-windows.exe

上面的代码展示了如何利用Go的交叉编译功能为Linux和Windows平台分别生成可执行文件。

标准库的跨平台支持

Go的标准库提供了一套统一的API用于文件操作、网络编程等,屏蔽了底层操作系统的差异。

代码示例:文件操作

// 使用Go标准库进行文件操作
package main

import (
	"io/ioutil"
	"log"
)

func main() {
	data := []byte("Hello, world!\n")
	// 写入文件
	err := ioutil.WriteFile("/tmp/hello.txt", data, 0644)
	if err != nil {
		log.Fatal(err)
	}
}

这个代码示例展示了如何使用ioutil包进行文件操作,该操作在Unix和Windows平台上都是有效的。

体积小、依赖少

由于Go应用编译后是单一的可执行文件,无需外部依赖,这大大简化了在不同环境中的部署。

C语言交互

通过cgo工具,Go能够轻易地与C语言库进行交互,这一点大大增强了其可移植性。

代码示例:cgo

// #include <stdio.h>
import "C"

func main() {
	C.puts(C.CString("Hello, world!"))
}

上面的代码示例展示了如何使用cgo调用C语言的puts函数。

小结

Go通过其出色的跨平台编译器、丰富的标准库和与C语言的高度互操作性,展现了强大的可移植性和跨平台支持。在如今多元化和全球化的软件开发环境中,可移植性和跨平台支持是任何编程语言成功的关键因素之一。Go语言在这方面的表现使其成为了一个值得投资和使用的编程工具。


八、总结

Go语言,自2009年由Google推出以来,凭借其简洁的语法、出色的性能和高度的可移植性,迅速崭露头角。它为并发编程提供了一流的支持,同时拥有丰富而强大的标准库。在云原生、微服务、数据分析等多个前沿领域里,Go已经成为了一种不可或缺的编程工具。它的生态系统日渐完善,拥有大量的开源项目和活跃的社群。综上所述,无论你是希望构建高性能的服务端应用,还是寻求一种高效、可靠的通用编程语言,Go都是一个值得深入学习和使用的选择。

file

关注TechLeadCloud,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

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

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

相关文章

什么是数据库锁(Lock)?有哪些类型的锁

数据库锁&#xff08;Lock&#xff09;&#xff1a;保护数据完整性与并发性的关键 数据库锁&#xff08;Lock&#xff09;是在数据库管理系统中用于管理并发访问数据的重要机制。它们确保了多个用户或事务可以同时访问数据库&#xff0c;同时保护数据的完整性。在本文中&#…

JJJ:添加开机自启动项

比如我希望一个截图软件能开机自启动&#xff1a; 1、打开任务管理器&#xff1a; 进入启动栏&#xff1a; 发现没有snipaste可以设置 2、win r&#xff0c; 输入 shell:startup 然后回弹出一个新的窗口&#xff0c;把截图软件的快捷方式放里头 这样snipaste就能开机自启动…

Python报错:KeyError: ‘820‘

Python报错&#xff1a;KeyError: ‘820’ 问题描述 原因 操作的表格列名是数字 NIRdata[820] Rdata[630]以上是出错行&#xff0c;dataframe的这种索引方式不支持用数字。 解决方案 先修改列名为字符 然后将出错行改为对应列名 NIRdata[nir] Rdata[r]

QSS之QLineEdit

QLineEdit我们在开发过程中是经常使用的&#xff0c;一般情况下默认的风格是不适合设计师的要求&#xff0c;本篇介绍QLineEdit的基本qss风格&#xff1a; 1.基本属性设置 QLineEdit{background-color:#FFFFFF;color:#333333;border:none;} 2.悬浮状态设置 QLineEdit:hover…

亲和力的作用,以及提高亲和力的六个办法

亲和力指的是容易使人亲近&#xff0c;当人身处集体中&#xff0c;亲和力也即是影响力和凝聚力的体现。通常是在职场中会明确对亲和力的考评&#xff0c;尤其是某些管理型岗位&#xff0c;所以HR人力资源管理中对亲和力有详细的评级标准。不过这里小猫测试网不详细讨论亲和力的…

【Linux】 OpenSSH_7.4p1 升级到 OpenSSH_9.3p2(亲测无问题,建议收藏)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

[Java·算法·困难]LeetCode124.二叉树中的最大路径和

每天一题&#xff0c;防止痴呆 题目示例分析思路1题解1 &#x1f449;️ 力扣原文 题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经…

第七章 查找 七、红黑树

一、为什么要发明红黑树 因为&#xff1a; 平衡二叉树AVL:插入/删除很容易破坏“平衡”特性&#xff0c;需要频繁调整树的形态。如:插入操作导致不平衡&#xff0c;则需要先计算平衡因子&#xff0c;找到最小不平衡子树&#xff08;时间开销大&#xff09;&#xff0c;再进行L…

Ubuntu配置深度学习环境(TensorFlow和pyTorch)

文章目录 一、CUDA安装1.1 安装显卡驱动1.2 CUDA安装1.3 安装cuDNN 二、Anaconda安装三、安装TensorFlow和pyTorch3.1 安装pyTorch3.2 安装TensorFlow2 四、安装pyCharm4.1 pyCharm的安装4.2 关联anaconda的Python解释器 五、VScode配置anaconda的Python虚拟环境 前言&#xff…

使用sqlmap的 ua注入

文章目录 1.使用sqlmap自带UA头的检测2.使用sqlmap随机提供的UA头3.使用自己写的UA头4.调整level检测 测试环境&#xff1a;bWAPP SQL Injection - Stored (User-Agent) 1.使用sqlmap自带UA头的检测 python sqlmap.py -u http://127.0.0.1:9004/sqli_17.php --cookie“BEEFHOO…

C语言 —— 函数

目录 1. 函数是什么 2. C语言中函数的分类 2.1 库函数 2.2 自定义函数 3. 函数的参数 3.1 实际参数(实参) 3.2 形式参数(形参) 4. 函数的调用 4.1 传值调用 4.2 传址调用 5. 函数的嵌套调用和链式访问 5.1 嵌套调用 5.2 链式访问 6. 函数的声明和定义 6.1函数声明…

GEO生信数据挖掘(四)数据清洗(离群值处理、低表达基因、归一化、log2处理)

检索到目标数据集后&#xff0c;开始数据挖掘&#xff0c;本文以阿尔兹海默症数据集GSE1297为例 目录 离群值处理 删除 低表达基因 函数归一化&#xff0c;矫正差异 数据标准化—log2处理 完整代码 上节围绕着探针ID和基因名称做了一些清洗工作&#xff0c;还做了重复值检查…

Elasticsearch基础篇(三):Elasticsearch7.x的集群部署

Elasticsearch的集群部署 1. Elasticsearch集群架构主节点数据节点客户端节点分片节点间通信集群状态 2. Elasticsearch集群部署2.1 系统配置修改2.1.1 修改文件句柄数和线程数2.1.2 修改虚拟内存2.1.3 关闭交换空间&#xff08;Swap&#xff09; 2.2 下载es数据库并上传到服务…

企业部署,springboot+vue+vue,Linux上部署mysql与redis,docker中部署nginx,jenkins。完整详细。

企业项目部署全流程笔记 前言 涉及&#xff1a;Linux服务器&#xff0c;docker&#xff0c;Jenkins&#xff0c;nginx&#xff0c;springoot&#xff0c;vue&#xff0c;mysql&#xff0c;redis&#xff0c;git&#xff0c; docker生成容器类型&#xff1a;MySql&#xff0c…

5G消息发展的前景与挑战

随着5G技术的快速发展和普及&#xff0c;5G消息正逐渐成为全球通信领域的新焦点。 随着5G技术的快速发展和普及&#xff0c;5G消息正逐渐成为全球通信领域的新焦点。 5G消息发展呈现规模化、产业化趋势 自2020年4月国内三大运营商联合发布5G消息白皮书以来&#xff0c;已经过…

Ubuntu20.04.1编译qt6.5.3版mysql驱动

下载qtbase6.5.3源码&#xff0c;将plugin中sqldrivers源码拷至于项目工程中&#xff0c;使用qtcreator打开文件 1、下载mysql开发库 sudo apt-get update sudo apt-get install build-essential libmysqlclient-dev 2、在msyql子目录中CMakeLists.txt第一行添加头文件、引…

面试必考精华版Leetcode236. 二叉树的最近公共祖先

题目&#xff1a; 代码(首刷看解析 10.1&#xff09;&#xff1a; class Solution { public:TreeNode* ansnullptr;bool FindSon(TreeNode* root,TreeNode* p,TreeNode* q){if(root nullptr) return false;bool lson FindSon(root->left,p,q);bool rson FindSon(root-&…

力扣 -- 712. 两个字符串的最小ASCII删除和

解题过程&#xff1a; 参考代码&#xff1a; class Solution { public:int minimumDeleteSum(string s1, string s2) {int ms1.size();int ns2.size();//求两个字符串的总ASCII和int sum0;for(const auto& e:s1){sume;}for(const auto& e:s2){sume;}//多开一行&#x…

数据结构与算法-(6)---栈的应用-(2)进制转换

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

基于STM32设计的智能化钻杆系统(华为云IOT)

一、项目引言 在现代石油、天然气等资源勘探和开采过程中,钻井是一项关键的工艺。为了提高钻井作业的准确性和效率,我们设计了一种基于STM32的智能化钻杆系统。该系统利用先进的控制和通信技术,实现了远程控制管子的转动和移动角度,并通过管子设备端的OLED显示屏显示接收到…