当前位置: 首页 > news >正文

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语言有一定的了解,并能在实际项目中灵活运用。

相关文章:

Go语言入门

Go语言入门 简介 Go是一门由Google开发的开源编程语言&#xff0c;旨在提供高效、可靠和简洁的软件开发工具。Go具有静态类型、垃圾回收、并发性和高效编译的特点&#xff0c;适用于构建可扩展的网络服务和系统工具。本文将介绍Go语言的基础知识和常用功能&#xff0c;并通过…...

Python学习笔记第五十五天(Pandas CSV文件)

Python学习笔记第五十五天 Pandas CSV 文件read_csv()to_string()to_csv() 数据处理head()tail()fillna() info() 后记 Pandas CSV 文件 CSV&#xff08;Comma-Separated Values&#xff0c;逗号分隔值&#xff0c;有时也称为字符分隔值&#xff0c;因为分隔字符也可以不是逗号…...

自然语言处理: 第七章GPT的搭建

自然语言处理: 第七章GPT的搭建 理论基础 在以transformer架构为框架的大模型遍地开花后&#xff0c;大模型的方向基本分成了三类分别是: decoder-only架构 , 其中以GPT系列为代表encoder-only架构&#xff0c;其中以BERT系列为代表encoder-decoder架构&#xff0c;标准的tr…...

【奶奶看了都会】2分钟学会制作最近特火的ikun幻术图

1.效果展示 最近ikun幻术图特别火啊&#xff0c;在网上能找到各种各样的ikun姿势图片&#xff0c;这些图片都是AI绘制的&#xff0c;能和风景完美融合在一起&#xff0c;今天小卷就来教大家怎么做这种图片 先看看图片效果 视频链接&#xff1a; 仿佛见到一位故人&#xff0c;…...

【深度学习】【风格迁移】Zero-shot Image-to-Image Translation

论文&#xff1a;https://arxiv.org/abs/2302.03027 代码&#xff1a;https://github.com/pix2pixzero/pix2pix-zero/tree/main 文章目录 Abstract1. Introduction相关工作3. Method Abstract 大规模文本到图像生成模型展示了它们合成多样且高质量图像的显著能力。然而&#x…...

Day 30 C++ STL 常用算法(上)

文章目录 算法概述常用遍历算法for_each——实现遍历容器函数原型示例 transform——搬运容器到另一个容器中函数原型注意示例 常用查找算法find——查找指定元素函数原型示例 find_if—— 查找符合条件的元素函数原型示例 adjacent_find——查找相邻重复元素函数原型示例 bina…...

MES系统在机器人行业生产管理种的运用

机器人的智能水平也伴随技术的迭代不断攀升。 2021年的春晚舞台上&#xff0c;来自全球领先工业机器人企业abb的全球首款双臂协作机器人yumi&#xff0c;轻松自如地表演了一出写“福”字&#xff0c;赢得了全国观众的赞叹。 在汽车装配领域&#xff0c;一台机器人可以自主完成一…...

Spark(39):Streaming DataFrame 和 Streaming DataSet 输出

目录 0. 相关文章链接 1. 输出的选项 2. 输出模式(output mode) 2.1. Append 模式(默认) 2.2. Complete 模式 2.3. Update 模式 2.4. 输出模式总结 3. 输出接收器(output sink) 3.1. file sink 3.2. kafka sink 3.2.1. 以 Streaming 方式输出数据 3.2.2. 以 batch …...

【云原生】Docker 详解(一):从虚拟机到容器

Docker 详解&#xff08;一&#xff09;&#xff1a;从虚拟机到容器 1.虚拟化 要解释清楚 Docker&#xff0c;首先要解释清楚 容器&#xff08;Container&#xff09;的概念。要解释容器的话&#xff0c;就需要从操作系统说起。操作系统太底层&#xff0c;细说的话一两本书都说…...

代码随想录第48天 | 198. 打家劫舍、213. 打家劫舍II、337. 打家劫舍III

198. 打家劫舍 当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。 递归五部曲&#xff1a; dp[i]&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[i]。决定dp[i]的因素就是第i房间偷还是不偷。 如果偷第i房间&…...

【LeetCode】按摩师

按摩师 题目描述算法分析编程代码 链接: 按摩师 题目描述 算法分析 编程代码 class Solution { public:int massage(vector<int>& nums) {int n nums.size();if(n 0) return 0;vector<int> f(n);auto g f;f[0] nums[0];for(int i 1;i<n;i){f[i] g[i…...

国际腾讯云账号云核算概述!!

云核算概述 维基百科界说&#xff1a;云核算是一种依据互联网的新型核算方法&#xff0c;经过互联网上异构、自治的服务为个人和企业供给按需即取的核算。 云核算描绘的一起特征&#xff1a;云是一种按需运用的服务&#xff0c;运用者只重视服务本身。 云核算作为IT服务形式&am…...

.NET 6.0 重启 IIS 进程池

在 .NET 6.0 中&#xff0c;你可以使用 Microsoft.Web.Administration 命名空间提供的 API 来管理 IIS 进程池并实现重启操作。以下是一个示例代码&#xff0c;展示如何使用 .NET 6.0 中的 Microsoft.Web.Administration 来重启 IIS 进程池&#xff1a; using Microsoft.Web.A…...

一位心理学教师对ChatGPT的看法,提到了正确地使用它的几个要点

在没有自主学习能力和有自主学习能力的两类学生中&#xff0c;ChatGPT的出现&#xff0c;会加大他们在知识学习及思维发展上的鸿沟。爱学习的人会因为AI变得更好…… 从2022年年底起&#xff0c;ChatGPT的技术突破使人类终于进入了一个AI被广泛应用在工作、学习、生活的时代。…...

认识Node.js及三个模块

文章目录 1.初识 Node.js1.1 什么是 Node.js1.2 Node.js 中的 JavaScript 运行环境1.3 Node.js 可以做什么1.4 Node.js 环境的安装1.4.1 区分 LTS 版本和 Current 版本的不同1.4.2 查看已安装的 Node.js 的版本号1.4.3 什么是终端1.4.4 终端中的快捷键 1.5 在 Node.js 环境中执…...

49 | 公司销售数据分析

公司销售数据分析报告 本数据是2012~2014年间一家生产体育类产品的全球销售订单数据,分别按时间、产品类别、销售国家统计产品销售情况,分析销售额和利润额统计各产品市场占有份额,为下一步生产计划提供有价值的建议。 数据大小:88475 行, 11 列 Retailer country销售国…...

Android 项目导入高德SDK初次上手

文章目录 一、前置知识&#xff1a;二、学习目标三、学习资料四、操作过程1、创建空项目2、高德 SDK 环境接入2.1 获取高德 key2.2下载 SDK 并导入2.2.1、下载SDK 文件2.2.2、SDK 导入项目2.2.3、清单文件配置2.2.4、隐私权限 3、显示地图 一、前置知识&#xff1a; 1、Java 基…...

生成树协议用来解决网络风暴的问题?(第三十二课)

生成树协议用来解决网络风暴的问题?(第三十二课) 一 STP RSTP MSTP 介绍 STP(Spanning Tree Protocol)、RSTP(Rapid Spanning Tree Protocol)和MSTP(Multiple Spanning Tree Protocol)都是用于网络中避免环路的协议。 STP是最初的协议,它通过将某些端口阻塞来防止…...

git分支操作

Git分支的操作 1.1 Git分支简介 Git分支是由指针管理起来的&#xff0c;所以创建、切换、合并、删除分支都非常快&#xff0c;非常适合大型项目的开发。 在分支上做开发&#xff0c;调试好了后再合并到主分支。那么每个人开发模块式都不会影响到别人。 分支使用策略&#xf…...

【基础学习笔记 enum】TypeScript 中的 enum 枚举类型介绍

因为之前网上查好多博客都是只说最基础的&#xff0c;所以这里记录一下&#xff0c;最基础的放在最后面。 这里重点要记录的是枚举成员的值可以是字符串&#xff08;字符串枚举&#xff0c;因为网上大部分只介绍常数枚举&#xff09;&#xff0c;需要注意的一点是&#xff0c;…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...