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语言中,有多种整数类型,包括int8、int16、int32、int64、uint8、uint16、uint32、uint64,以及int和uint。其中,int和uint的大小与当前操作系统的位数相关。例如,在64位操作系统上,int和uint分别为int64和uint64。
下面是一个示例代码,演示了整数的声明和使用:
package mainimport "fmt"func main() {var a int = 10var b int64 = 20c := 30fmt.Println(a + int(b) + c)
}
输出结果将是:
60
浮点数类型
在Go语言中,浮点数类型包括float32和float64。默认情况下,Go会将浮点数视为float64类型。下面是一个示例代码,演示了浮点数的声明和使用:
package mainimport "fmt"func main() {var a float32 = 3.14b := 6.28fmt.Println(a * float32(b))
}
输出结果将是:
19.7192
布尔类型
在Go语言中,布尔类型只有两个取值:true和false。下面是一个示例代码,演示了布尔类型的声明和使用:
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语言中的条件语句有if、else和switch三种形式。
下面是一个示例代码,演示了if和else语句的使用:
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语言中的循环语句有for和range两种形式。
下面是一个示例代码,演示了for循环语句的使用:
package mainimport "fmt"func main() {for i := 0; i < 5; i++ {fmt.Println(i)}
}
输出结果将是:
0
1
2
3
4
跳转语句
跳转语句用于在程序中跳转到指定的位置。Go语言中的跳转语句有break、continue和goto三种形式。
下面是一个示例代码,演示了break和continue语句的使用:
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开发的开源编程语言,旨在提供高效、可靠和简洁的软件开发工具。Go具有静态类型、垃圾回收、并发性和高效编译的特点,适用于构建可扩展的网络服务和系统工具。本文将介绍Go语言的基础知识和常用功能,并通过…...
Python学习笔记第五十五天(Pandas CSV文件)
Python学习笔记第五十五天 Pandas CSV 文件read_csv()to_string()to_csv() 数据处理head()tail()fillna() info() 后记 Pandas CSV 文件 CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号…...
自然语言处理: 第七章GPT的搭建
自然语言处理: 第七章GPT的搭建 理论基础 在以transformer架构为框架的大模型遍地开花后,大模型的方向基本分成了三类分别是: decoder-only架构 , 其中以GPT系列为代表encoder-only架构,其中以BERT系列为代表encoder-decoder架构,标准的tr…...
【奶奶看了都会】2分钟学会制作最近特火的ikun幻术图
1.效果展示 最近ikun幻术图特别火啊,在网上能找到各种各样的ikun姿势图片,这些图片都是AI绘制的,能和风景完美融合在一起,今天小卷就来教大家怎么做这种图片 先看看图片效果 视频链接: 仿佛见到一位故人,…...
【深度学习】【风格迁移】Zero-shot Image-to-Image Translation
论文:https://arxiv.org/abs/2302.03027 代码: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年的春晚舞台上,来自全球领先工业机器人企业abb的全球首款双臂协作机器人yumi,轻松自如地表演了一出写“福”字,赢得了全国观众的赞叹。 在汽车装配领域,一台机器人可以自主完成一…...
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 详解(一):从虚拟机到容器 1.虚拟化 要解释清楚 Docker,首先要解释清楚 容器(Container)的概念。要解释容器的话,就需要从操作系统说起。操作系统太底层,细说的话一两本书都说…...
代码随想录第48天 | 198. 打家劫舍、213. 打家劫舍II、337. 打家劫舍III
198. 打家劫舍 当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。 递归五部曲: dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为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…...
国际腾讯云账号云核算概述!!
云核算概述 维基百科界说:云核算是一种依据互联网的新型核算方法,经过互联网上异构、自治的服务为个人和企业供给按需即取的核算。 云核算描绘的一起特征:云是一种按需运用的服务,运用者只重视服务本身。 云核算作为IT服务形式&am…...
.NET 6.0 重启 IIS 进程池
在 .NET 6.0 中,你可以使用 Microsoft.Web.Administration 命名空间提供的 API 来管理 IIS 进程池并实现重启操作。以下是一个示例代码,展示如何使用 .NET 6.0 中的 Microsoft.Web.Administration 来重启 IIS 进程池: using Microsoft.Web.A…...
一位心理学教师对ChatGPT的看法,提到了正确地使用它的几个要点
在没有自主学习能力和有自主学习能力的两类学生中,ChatGPT的出现,会加大他们在知识学习及思维发展上的鸿沟。爱学习的人会因为AI变得更好…… 从2022年年底起,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初次上手
文章目录 一、前置知识:二、学习目标三、学习资料四、操作过程1、创建空项目2、高德 SDK 环境接入2.1 获取高德 key2.2下载 SDK 并导入2.2.1、下载SDK 文件2.2.2、SDK 导入项目2.2.3、清单文件配置2.2.4、隐私权限 3、显示地图 一、前置知识: 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分支是由指针管理起来的,所以创建、切换、合并、删除分支都非常快,非常适合大型项目的开发。 在分支上做开发,调试好了后再合并到主分支。那么每个人开发模块式都不会影响到别人。 分支使用策略…...
【基础学习笔记 enum】TypeScript 中的 enum 枚举类型介绍
因为之前网上查好多博客都是只说最基础的,所以这里记录一下,最基础的放在最后面。 这里重点要记录的是枚举成员的值可以是字符串(字符串枚举,因为网上大部分只介绍常数枚举),需要注意的一点是,…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
