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 枚举类型介绍
因为之前网上查好多博客都是只说最基础的,所以这里记录一下,最基础的放在最后面。 这里重点要记录的是枚举成员的值可以是字符串(字符串枚举,因为网上大部分只介绍常数枚举),需要注意的一点是,…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
