当前位置: 首页 > 科技观察

关于Go语言的一些很酷的事情

时间:2023-03-20 23:05:59 科技观察

简介Go是一种相对较新的语言,由谷歌的RobertGriesemer、RobPike和KenThompson在2009年之前创建。它是开源的,因此任何人都可以为它做出贡献并提出新功能建议。C++的替代品似乎主要是为了让谷歌的软件工程师的生活更轻松。它面向系统编程,例如云系统、分布式系统和微服务。Go的一些特性是静态类型的。所有变量都需要用给定的类型声明。bool、string和“number”(int、uint、float64、complex128等)类型是原始类型。然后,也可以声明结构(就像在C中一样)。这有助于在编译时检测错误。哦,顺便说一下,Go是一种编译语言。Go代码编译速度非常快!这是创建者试图改进的关于C和C++的关键事情之一,他们做到了!此外,由于代码直接编译为机器代码,因此执行时间非常快。这也使得可执行文件高度可移植到具有相同平台的其他计算机。Go有接口。对于面向对象的程序员来说,这可能有点令人失望,但Go没有类。它不支持继承。但是,它确实支持创建结构和为它们定义方法。此外,它支持接口的定义,从而实现松散耦合的系统。另一件很酷的事情是,您可以定义一个空接口(interface{}),然后它将声明一个通用对象!Go专注于处理错误。Go不支持异常。它的理念是函数必须返回一个返回值(或多个值,因为它可以同时返回多个变量)和一个错误值。这让开发人员可以考虑在发生故障时该怎么办。但是,也有类似异常的东西,“panic”和“recovery”机制。去收集垃圾。这是对C和C++的重大改进。这是一种非常高效的语言,它添加了大多数最新语言所具有的非常有用的功能。Go支持内置并发。这是迄今为止Go语言最酷的特性!它非常高效且易于使用。我们将在下一节中详细介绍。Go中的并发性首先,让我们区分并发性和并行性。并发是指独立进程同时执行,但不一定同时执行。并行意味着执行是同时的。所以并行化只能用多核来实现,并发只能在单核上通过适当调度不同的进程来完成。Go实现了非常高效的并发,也支持并行。Go被认为遵循并发的actor模型。在这个模型中,参与者是原始的计算单位。接受消息并根据它进行一些计算的东西。他们接受输入、执行操作并提供输出。Go中的Actor是协程。角色彼此完全隔离。这意味着它们不共享内存,而是通过为它们提供同步的其他结构进行通信。Go为此实现了渠道。尽管共享内存结构可以被不同的goroutines使用,但是使用channels使得并发变得非常简单和安全。最好的部分是goroutines非常轻量级。Go计划在系统线程上执行goroutines,允许多个goroutines在单个OS线程上并发运行。这样做的好处是减少了例程的堆栈(操作系统线程为4KB,而操作系统线程为1MB)并节省了操作系统线程之间上下文切换的成本,这比在goroutine之间切换要大得多。我们甚至可以以非常低的成本同时运行数十万个goroutine!我们还提到在Go中很容易使用并发。让我们看一个例子!packagemainimport"fmt"funcadd_string(string_to_addstring,input_chchanstring,output_chchanstring){fmt.Println("Running:add_string")result_string:=<-input_ch+string_to_addoutput_ch<-result_string}funcinitialize_string(initial_stringstring)Println("Running:initialize_string")input_ch<-initial_string}funcmain(){input_ch:=make(chanstring)output_ch:=make(chanstring)goadd_string("HelloWorld!",input_ch,output_ch)goinitialize_string("",input_ch)fmt.Println("Waitingforgoroutines")fmt.Println(<-output_ch)}运行此代码后,输出为:WaitingforgoroutinesRunning:initialize_stringRunning:add_stringHelloWorld!所以在这里我们看到运行并发go例程是多么容易。只需定义一个函数并在调用它之前添加“go”。就这么简单!这将调度goroutine,但调用函数的执行将继续。在这种情况下,我们调用函数来添加“HelloWorld!”。第一的。然后是初始化函数,然后我们打印消息“Waitingforgoroutines”,但控制台显示的打印消息顺序不同。为什么?如前所述,要同步goroutines,我们可以使用通道。我们首先创建一个输入通道和一个输出通道,然后按以下方式使用它们。add_string函数将等待输入通道中有内容。然后我们调用函数用空字符串初始化输入通道。但是,主函数继续执行“等待goroutines”。然后它等待输出通道中的内容。这将允许初始化函数将空字符串放入输入通道。add_string函数将唤醒并添加“HelloWorld!”。到输出通道,然后主函数将再次唤醒并最终打印完整的消息。简单吧?围棋用在什么地方?Go用于开发您可能知道的许多解决方案,例如Google、YouTube、Soundcloud、Docker等。但是让我们在Worldsensing中开始使用Go的是Chirpstack。这是一个开源LoRaWAN网络服务器堆栈。它提供了一个用于设备管理的Web界面,并提供了许多方法来集成其他应用程序,例如API、MQTT队列等。它具有模块化架构,如您所见。Chirpstack是可配置的并且易于部署。您甚至可以找到带有docker-compose.yml文件的开源项目,它可以轻松启动一切!如您所见,像Go这样的伟大语言允许开发人员创建伟大的项目。