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

目录

  • 一、引言
    • 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 / divisorremainder = dividend % divisorreturn
}
输出

使用这个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 := 0for _, 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 chfmt.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 intY float64Text 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 mainimport ("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:- reviewshttp:- route:- destination:host: reviewssubset: 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 mainimport ("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.mzph.cn/news/91932.shtml

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

相关文章

Python集成开发环境(IDE):WingPro for Mac

WingPro for Mac是一款Python集成开发环境&#xff08;IDE&#xff09;软件&#xff0c;它提供了一系列强大的工具和功能&#xff0c;帮助Python开发人员提高开发效率和质量。 WingPro for Mac拥有直观的用户界面和强大的调试器&#xff0c;可以帮助用户快速定位问题和修复错误…

10.1作业

#include <stdio.h> #include <string.h> #include <stdlib.h> /** function:* 创建一个双向链表&#xff0c;将26个英文字母通过头插的方式插入&#xff0c;通过为尾删的方式读取并删除* param [ in] * param [out] * return */ typedef struct double…

Redis代替session 实现登录流程

Redis代替session 实现登录流程 如果使用String&#xff0c;他的value&#xff0c;用多占用一点空间&#xff0c;如果使用哈希&#xff0c;则他的value中只会存储他数据本身&#xff0c;如果不是特别在意内存&#xff0c;其实使用String就可以 设计key的具体细节 在设计这个k…

Learning Invariant Representation for Unsupervised Image Restoration

Learning Invariant Representation for Unsupervised Image Restoration (Paper reading) Wenchao Du, Sichuan University, CVPR20, Cited:63, Code, Paper 1. 前言 近年来&#xff0c;跨域传输被应用于无监督图像恢复任务中。但是&#xff0c;直接应用已有的框架&#xf…

私有继承和虚函数私有化能用么?

源起 以前就知道private私有化声明关键字&#xff0c;和virtual虚函数关键字两者并不冲突&#xff0c;可以同时使用。 但是&#xff0c;它所表示的场景没有那么明晰&#xff0c;也觉得难以理解&#xff0c;直到近段时间遇到一个具体场景。 场景 借助ACE遇到的问题进行展示 …

四、2023.9.30.C++面向对象end.4

文章目录 49、 简述一下什么是常函数&#xff0c;有什么作用&#xff1f;50、 说说什么是虚继承&#xff0c;解决什么问题&#xff0c;如何实现&#xff1f;51、简述一下虚函数和纯虚函数&#xff0c;以及实现原理&#xff1f;52、说说纯虚函数能实例化吗&#xff0c;为什么&am…

【数据结构与算法】通过双向链表和HashMap实现LRU缓存 详解

这个双向链表采用的是有伪头节点和伪尾节点的 与上一篇文章中单链表的实现不同&#xff0c;区别于在实例化这个链表时就初始化了的伪头节点和伪尾节点&#xff0c;并相互指向&#xff0c;在第一次添加节点时&#xff0c;不需要再考虑空指针指向问题了。 /*** 通过链表与HashMa…

1 论文笔记:Efficient Trajectory Similarity Computation with ContrastiveLearning

2022CIKM 1 intro 1.1 背景 轨迹相似度计算是轨迹分析任务&#xff08;相似子轨迹搜索、轨迹预测和轨迹聚类&#xff09;最基础的组件之一现有的关于轨迹相似度计算的研究主要可以分为两大类&#xff1a; 传统方法 DTW、EDR、EDwP等二次计算复杂度O(n^2)缺乏稳健性 会受到非…

Flutter笔记:滚动之-无限滚动与动态加载的实现(GetX简单状态管理版)

Flutter笔记 无限滚动与动态加载的实现&#xff08;GeX简单状态管理版&#xff09; 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq…

stm32 - 初识2

stm32 - 初识2 工程架构点灯程序寄存器方式点灯库函数的方式点灯 工程架构 启动文件 中断向量表&#xff0c;中断服务函数&#xff0c;其他中断等 中断服务函数中的&#xff0c;复位中断是整个程序的入口&#xff0c;调用systeminit&#xff0c;和main函数 点灯程序 寄存器方式…

HTML的相关知识

1.什么是HTML&#xff1f;基本语法 HTML: Hyper Text Markup Language &#xff08;超文本标记语言&#xff09; 超文本&#xff1f;超级文本&#xff0c;例如流媒体&#xff0c;声音、视频、图片等。 标记语言&#xff1f;这种语言是由大量的标签组成。HTML标签参考手…

尚硅谷谷粒商城部分报错问题处理

1、启动报错&#xff1a; 内容&#xff1a; org.springframework.beans.factory.BeanCreationException: Error creating bean with name attrAttrgroupRelationController: Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed t…

Redis配置和优化

Redis配置和优化 一 、Redis介绍二、关系数据库和非关系数据库2.1、关系型数据库2.2、 非关系型数据库2.3、 非关系型数据库的产生背景2.4、 关系型数据库和非关系型数据库区别2.5、 总结 三、缓存概念3.1、系统缓存3.2、 缓存保存位置及分层结构3.2.1、DNS缓存3.2.2、 应用层缓…

10.1 File类

前言&#xff1a; java.io包中的File类是唯一一个可以代表磁盘文件的对象&#xff0c;它定义了一些用于操作文件的方法。通过调用File类提供的各种方法&#xff0c;可以创建、删除或者重命名文件&#xff0c;判断硬盘上某个文件是否存在&#xff0c;查询文件最后修改时间&…

【HTML】表格行和列的合并

概述 当我们需要在 HTML 表格中展示复杂的数据时&#xff0c;行和列的合并可以帮助我们实现更灵活的布局和结构。通过合并行和列&#xff0c;我们可以创建具有更多层次和结构的表格&#xff0c;使数据更易于理解和分析。 在 HTML 表格中&#xff0c;我们可以使用 rowspan 和 …

ELK整合springboot(第二课)

一、创建一个springboot的项目 pom文件如下&#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:schemaLo…

lv5 嵌入式开发-12 信号灯

目录 1 信号量/灯(semaphore)基本概念 2 信号量&#xff0d;&#xff30;&#xff0f;&#xff36;操作概念 3 三种信号灯 3.1 有名信号灯 3.1.1 打开 3.1.2 关闭 3.1.3 删除 3.2 无名信号灯 3.2.1 初始化 3.2.2 销毁 3.3 信号灯P操作 3.4 信号灯V操作 3.5 示例 …

Visual Studio 中将TAB设置为空格

将TAB设置为空格的原因很多&#xff0c;其中一点是为了统一不同编译器对TAB的解释&#xff0c;防止代码风格在不同编译器下不一致等。 在菜单中选择: 工具-->选项-->文本编辑器--->所有语言-->制表符 在窗口中选择&#xff0c;制表符大小和缩进大小都选为4&#xf…

10.1 国庆节小任务

目录 select实现服务器并发 服务器 客户端 运行现象 select实现服务器并发 服务器 #include<myhead.h>#define PORT 8888 //1024~49151 #define IP "192.168.1.104" //ifconfig查看本机IPint main(int argc, const char *argv[]) {//创建流式…

WiFi网络分析工具Airtool for Mac

Airtool是一款Mac平台上的WiFi网络分析工具&#xff0c;它可以帮助用户监测、分析和管理无线网络。 以下是Airtool的一些主要功能和特点&#xff1a; 实时监测&#xff1a;Airtool可以实时监测当前Mac设备所连接的WiFi网络&#xff0c;包括网络速度、信号强度、连接状态等。信…