Go语言入门

Go语言入门

简介

Go是一门由Google开发的开源编程语言,旨在提供高效、可靠和简洁的软件开发工具。Go具有静态类型、垃圾回收、并发性和高效编译的特点,适用于构建可扩展的网络服务和系统工具。本文将介绍Go语言的基础知识和常用功能,并通过示例代码和测试用例对其进行详细解释。

开始之前

让我们先来了解一下Go是什么,以及为什么我们选择学习它。

Go是由Google开发,用于处理大规模数据处理的静态强类型编译语言。Go拥有高效的运行速度,而且有助于节省处理器资源。因为Go语言特有的并行性,Go尤其适用于服务器编程和大数据处理。Go语言也被设计得非常明确,使得代码非常容易读懂。

我想再强调一遍Go的三个主要优点:第一,Go拥有一个强大而且明确的工具链。这使得Go语言非常容易被维护和测试。第二,Go语言有一个非常强大的并行和并发处理能力,使得Go非常适用于处理大数据。第三,Go语言是由Google支持和维护的,使得Go在处理大规模数据分析和服务器编程上有很大的优势。

OK,让我们开始吧。

安装Go

首先,我们需要在本地机器上安装Go编译器和相关工具。在Go官方网站(https://golang.org)上提供了各种操作系统的安装包,选择适合您操作系统的版本进行下载和安装。安装完成后,我们可以通过在终端中运行go version命令来验证安装是否成功。

  • Mac OS X 和 Linux 你可以使用下面的命令在你的终端中安装Go:
brew install go
  • Windows 你需要去Go的官网下载安装包并安装。

一旦你已经安装了Go语言,你可以在终端中输入以下命令来确认是否成功:

go version

如果显示出了Go的版本信息,那么你已经成功了。现在,我们可以开始编写我们的第一个Go程序了。

Hello World

让我们从经典的Hello World程序开始。创建一个名为hello.go的文件,并在其中输入如下代码:

package mainimport "fmt"func main() {fmt.Println("Hello, World!")
}

保存文件后,我们可以在终端中执行以下命令来运行程序:

go run hello.go

输出结果将是:

Hello, World!

在你的一个.go文件中输入以上代码,并用go run 文件名.go命令运行它。你应该在终端中看到“Hello, World!”这个结果。

现在让我们来解构一下刚刚我们写的程序:

  • package main这个声明了我们程序的包,main包是所有Go程序的入口。
  • import "fmt"这个导入了一个叫做fmt的包,我们可以通过这个包来进行控制台的输入输出。
  • func main()这个定义了我们的主函数,所有Go程序都从这个main函数开始运行。
  • fmt.Println("Hello, World!")这个是我们实际输出“Hello, World!”的语句。

基本语法

变量

在Go中,我们可以使用var关键词来定义一个变量:

var name = "John Doe"

这个定义了一个变量name并且赋值为"John Doe"

常量

在Go中,我们可以使用const关键词来定义一个常量:

const Pi = 3.14

这个定义了一个常量Pi并且赋值为3.14

基本数据类型

Go语言提供了几种基本的数据类型,包括整数、浮点数、布尔值和字符串。下面我们将介绍这些数据类型的使用方法及其常见操作。

整数类型

在Go语言中,有多种整数类型,包括int8int16int32int64uint8uint16uint32uint64,以及intuint。其中,intuint的大小与当前操作系统的位数相关。例如,在64位操作系统上,intuint分别为int64uint64

下面是一个示例代码,演示了整数的声明和使用:

package mainimport "fmt"func main() {var a int = 10var b int64 = 20c := 30fmt.Println(a + int(b) + c)
}

输出结果将是:

60

浮点数类型

在Go语言中,浮点数类型包括float32float64。默认情况下,Go会将浮点数视为float64类型。下面是一个示例代码,演示了浮点数的声明和使用:

package mainimport "fmt"func main() {var a float32 = 3.14b := 6.28fmt.Println(a * float32(b))
}

输出结果将是:

19.7192

布尔类型

在Go语言中,布尔类型只有两个取值:truefalse。下面是一个示例代码,演示了布尔类型的声明和使用:

package mainimport "fmt"func main() {var a bool = trueb := falsefmt.Println(a && b)
}

输出结果将是:

false

字符串类型

在Go语言中,字符串是以双引号包围的一串字符。下面是一个示例代码,演示了字符串的声明和使用:

package mainimport "fmt"func main() {var a string = "Hello"b := " World!"fmt.Println(a + b)
}

输出结果将是:

Hello World!

控制流程

Go语言提供了多种控制流程语句,包括条件语句、循环语句和跳转语句。下面我们将介绍这些语句的使用方法及其常见操作。

条件语句

条件语句用于根据不同的条件执行不同的代码块。Go语言中的条件语句有ifelseswitch三种形式。

下面是一个示例代码,演示了ifelse语句的使用:

package mainimport "fmt"func main() {var a = 10if a > 0 {fmt.Println("a is positive")} else if a == 0 {fmt.Println("a is zero")} else {fmt.Println("a is negative")}
}

输出结果将是:

a is positive

循环语句

循环语句用于重复执行一段代码。Go语言中的循环语句有forrange两种形式。

下面是一个示例代码,演示了for循环语句的使用:

package mainimport "fmt"func main() {for i := 0; i < 5; i++ {fmt.Println(i)}
}

输出结果将是:

0
1
2
3
4

跳转语句

跳转语句用于在程序中跳转到指定的位置。Go语言中的跳转语句有breakcontinuegoto三种形式。

下面是一个示例代码,演示了breakcontinue语句的使用:

package mainimport "fmt"func main() {for i := 0; i < 5; i++ {if i == 3 {break}if i == 1 {continue}fmt.Println(i)}
}

输出结果将是:

0
2

函数

在Go语言中,函数是一段可重复使用的代码块,用于执行特定的任务。函数可以有参数和返回值,也可以没有。

下面是一个示例代码,演示了函数的声明和调用:

package mainimport "fmt"func add(a, b int) int {return a + b
}func main() {result := add(3, 5)fmt.Println(result)
}

输出结果将是:

8

并发编程

Go语言通过goroutine和channel提供了原生的并发编程支持。goroutine是轻量级的执行线程,可以与其他goroutine并发执行。channel用于goroutine之间的通信。

下面是一个示例代码,演示了goroutine和channel的使用:

package mainimport "fmt"func worker(id int, jobs <-chan int, results chan<- int) {for job := range jobs {fmt.Println("Worker", id, "started job", job)// 模拟耗时的任务for i := 0; i < job; i++ {// do something}fmt.Println("Worker", id, "finished job", job)results <- job * 2}
}func main() {jobs := make(chan int, 100)results := make(chan int, 100)// 创建三个goroutine执行任务for i := 1; i <= 3; i++ {go worker(i, jobs, results)}// 发送一百个任务到jobs通道for i := 1; i <= 100; i++ {jobs <- i}close(jobs)// 输出结果for i := 1; i <= 100; i++ {<-results}
}

通过以上代码,我们可以看到三个goroutine并发执行了一百个任务,并且按顺序返回了结果。

测试

Go语言提供了内置的测试框架以及丰富的测试工具。我们可以通过编写测试用例来验证代码的正确性,并使用go test命令执行测试。

下面是一个示例代码,演示了如何编写测试用例:

package mainimport "testing"func add(a, b int) int {return a + b
}func TestAdd(t *testing.T) {result := add(3, 5)if result != 8 {t.Errorf("Expected 8, but got %d", result)}
}

运行go test命令将会执行测试,并输出结果:

PASS
ok      _/path/to/package      0.001s

总结

本文介绍了Go语言的基础知识和常用功能,包括安装Go、Hello World程序、基本数据类型、控制流程、函数、并发编程和测试等方面。希望读者能通过本文对Go语言有一定的了解,并能在实际项目中灵活运用。

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

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

相关文章

Web菜鸟教程 - Radis实现高性能数据库

Redis是用C语言开发的一个高性能键值对数据库&#xff0c;可用于数据缓存&#xff0c;主要用于处理大量数据的高访问负载。 也就是说&#xff0c;如果你对性能要求不高&#xff0c;不用Radis也是可以的。不过作为最自己写的程序有高要求的程序员&#xff0c;自然是要学一下的&a…

PHP Mysql查询全部全部返回字符串类型

设置pdo属性 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

08-1_Qt 5.9 C++开发指南_QPainter绘图

文章目录 前言1. QPainter 绘图系统1.1 QPainter 与QPaintDevice1.2 paintEvent事件和绘图区1.3 QPainter 绘图的主要属性 2. QPen的主要功能3. QBrush的主要功能4. 渐变填充5. QPainter 绘制基本图形元件5.1 基本图像元件5.2 QpainterPath的使用 前言 本章所介绍内容基本在《…

chatserver服务器开发笔记

chatserver服务器开发笔记 1 chatserver2 开发环境3 编译 1 chatserver 集群聊天服务器和客户端代码&#xff0c;基于muduo、redis、mysql实现。 学习于https://fixbug.ke.qq.com/ 本人已经挂github&#xff1a;https://github.com/ZixinChen-S/chatserver/tree/main 需要该项…

kubernetes pod 资源限制 探针

资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小&#xff0c;以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时&#xff0c;代表容器运行所需的最小资源量&#xff0c;调度器就使用该信息来决定将 Pod …

Java课题笔记~ JSP开发模型

MVC 1.JSP演化历史 1. 早期只有servlet&#xff0c;只能使用response输出标签数据&#xff0c;非常麻烦 2. 后来有了jsp&#xff0c;简化了Servlet的开发&#xff0c;如果过度使用jsp&#xff0c;在jsp中即写大量的java代码&#xff0c;有写html表&#xff0c;造成难于维护&…

计算机网络实验4:HTTP、DNS协议分析

文章目录 1. 主要教学内容2. HTTP协议3. HTTP分析实验【实验目的】【实验原理】【实验内容】【实验思考】 4. HTTP分析实验可能遇到的问题4.1 捕捉不到http报文4.2 百度是使用HTTPS协议进行传输4.3 Wireshark获得数据太多如何筛选4.4 http报文字段含义不清楚General&#xff08…

[4G/5G/6G专题基础-161]:常见的滤波技术

1. 滤波概述 1.1 什么是滤波 滤波&#xff08;Filtering&#xff09;是信号处理中的一种基本操作&#xff0c;用于改变信号的特性或者去除信号中的干扰成分。滤波器可以看作是一种系统&#xff0c;将输入信号作为输入&#xff0c;经过处理后产生输出信号。 滤波在信号处理中…

Git和GitHub

文章目录 1.Git介绍2. 常用命令3. Git分支操作4. Git团队协作机制5. GitHub操作6. IDEA集成Git7.IDEA操作GitHub8. Gitee 1.Git介绍 Git免费的开源的分布式版本控制系统&#xff0c;可以快速高效从小到大的各种项目 Git易于学习&#xff0c;占地面积小&#xff0c;性能快。它…

@RunWith的使用

引言 当谈到在Java中进行单元测试时&#xff0c;JUnit是开发人员的常见选择之一。JUnit是一个流行的单元测试框架&#xff0c;它允许您编写和执行测试来验证代码的正确性。在JUnit中&#xff0c;RunWith注解是一个强大的工具&#xff0c;它可以用来定制测试运行器&#xff0c;…

【日常积累】RPM包依赖下载及私有yum仓库搭建

概述 某些时候&#xff0c;我们需要下载某个RPM包依赖的依赖。如某些内网环境&#xff0c;就需要自行准备rpm包。可以通过能上互联网的服务器进行相应的rpm包下载&#xff0c;然后在拷贝到相应的服务器安装&#xff0c;或者搭建自己的内容rpm包仓库。 查看*.rpm 包依赖&#…

Flink多流处理之Broadcast(广播变量)

写过Spark批处理的应该都知道,有一个广播变量broadcast这样的一个算子,可以优化我们计算的过程,有效的提高效率;同样在Flink中也有broadcast,简单来说和Spark中的类似,但是有所区别,首先Spark中的broadcast是静态的数据,而Flink中的broadcast是动态的,也就是源源不断的数据流.在…

批处理自动切换ip地址与网络的启用、禁用

启用禁用网络 echo off :: BatchGotAdmin :------------------------------------- REM --> Check for permissions >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" REM --> If error flag set,…

什么是微服务?

2.微服务的优缺点 优点 单一职责原则每个服务足够内聚&#xff0c;足够小&#xff0c;代码容易理解&#xff0c;这样能聚焦一个指定的业务功能或业务需求&#xff1b;开发简单&#xff0c;开发效率提高&#xff0c;一个服务可能就是专一的只干一件事&#xff1b;微服务能够被小…

命令提示符之操作基础(Windows)

打开命令提示符 方法一 打开指定文件的文件夹&#xff0c;在路径栏里输入“cmd”&#xff0c;回车&#xff0c;就进入控制台了。默认路径就是指定文件夹的路径。 方法二 打开指定的文件夹&#xff0c;按住shift键&#xff0c;在空白处右击&#xff0c;在菜单栏中选择“在此处打…

社区团购商城拼团秒杀接龙分销团长小程序开源版开发

社区团购商城拼团秒杀接龙分销团长小程序开源版开发 功能介绍&#xff1a; 商品管理&#xff1a;增加商品-商品列表-商品分类-商品单/多规格-商品标签 订单管理&#xff1a;订单列表-订单挑选-订单导出-订单打印-批量发货-商品评价 会员管理&#xff1a;会员列表-会员挑选-会员…

【Git】—— 标签管理

目录 &#xff08;一&#xff09;理解标签 1、作用 &#xff08;二&#xff09;创建标签 &#xff08;三&#xff09;操作标签 1、删除标签 2、推送标签 3、删除远程标签 &#xff08;一&#xff09;理解标签 标签 tag &#xff0c;可以简单的理解为是对某次 commit 的…

python中的迭代器和生成器

一、迭代器 支持迭代的容器&#xff0c;如列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09;、字典&#xff08;dict&#xff09;、集合&#xff08;set&#xff09;这些序列式容器。 自定义迭代器的类中必须实现以下2个方法&#xff1a; __next__(self)…

监控Kubernetes 控制面组件的关键指标

控制面组件的监控&#xff0c;包括 APIServer、Controller-manager&#xff08;简称 CM&#xff09;、Scheduler、etcd 四个组件。 1、APIServer APIServer 的核心职能是 Kubernetes 集群的 API 总入口&#xff0c;Kube-Proxy、Kubelet、Controller-Manager、Scheduler 等都需…

【字符串】649. Dota2 参议院

649. Dota2 参议院 解题思路 R true 表示循环结束之后 字符串仍然存在 Rflag > 0 说明R在D之前出现 R可以消灭Dflag < 0 说明D在R之前出现 D 可以消灭R一旦其中有一个为false 说明只剩下R 或者D 那么就可以决定谁获胜遍历字符串 如果当前字符是R 判断flag 如果flag &l…