Go开始:Go基本元素介绍

news2025/1/16 1:54:34

目录

  • 标识符与关键字
    • Go中的标识符
    • Go关键字
      • 关键字示例
  • 具名的函数
    • 常规函数
      • 代码示例
    • 方法
      • 代码示例
    • 高阶函数
      • 代码示例
    • 匿名函数与Lambda表达式
      • 代码示例
    • 闭包
      • 代码示例
  • 具名的值
    • 变量
      • 基本数据类型
      • 复合数据类型
      • 指针类型
    • 常量
      • 基本常量类型
      • 枚举常量
      • 常量表达式
  • 定义类型和类型别名
    • 类型定义(Type Definition)
      • 基础类型
      • 复合类型
      • 接口类型
    • 类型别名(Type Alias)
    • 类型定义与类型别名的区别
      • 代码示例
  • 包和模块管理
    • 包(Packages)
      • 标准库包
      • 自定义包
      • 包的可见性
    • 模块(Modules)
      • 初始化模块
      • 添加依赖
      • 升级和降级依赖
  • 代码块与断行
    • 代码块(Code Blocks)
      • 函数体
      • 控制结构
      • 声明块
    • 断行(Line Breaks)
      • 语句结束
      • 长语句的断行
      • 函数调用和定义
  • 总结

本文深入探讨了Go编程语言中的核心概念,包括标识符、关键字、具名函数、具名值、定义类型、类型别名、包和模块管理,以及代码块和断行。这些元素是构成Go程序的基础,也是编写高质量代码的关键。

关注TechLeadCloud,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

在Go编程中,代码元素是构建软件的基础。本文旨在深入探讨Go语言中的各种代码元素,包括函数、变量、类型和更多。我们还会涉及如何通过包(package)来组织这些元素,以及Go的关键字和标识符规则。

file

标识符与关键字

file
在任何编程语言中,标识符和关键字都是核心概念,Go也不例外。标识符用于命名各种类型的代码元素,如变量、常量、函数等。关键字是预留的词汇,用于指示编程语言的特定操作。在本部分中,我们将详细介绍Go语言中的标识符和关键字。

Go中的标识符

标识符是用于标识各种程序实体(例如变量、函数、类型等)的名称。在Go中,标识符遵循以下规则:

  1. 必须以字母或下划线(_)开头。
  2. 可以包含字母、数字和下划线(_)。
  3. 区分大小写。

例如,以下都是有效的Go标识符:

name
_x9
go_variable
Count123

以下是无效的标识符:

9name // 以数字开头
!var // 包含非法字符

Go关键字

Go语言有25个预留的关键字,不能用作标识符。以下是这些关键字的列表以及它们的简要解释:

break       用于中断循环或switch语句
default     用于switch语句,表示默认情况
func        定义新的函数
interface   定义接口
select      用于处理多个通道
case        用于switch和select语句中的条件分支
defer       用于确保函数调用在程序执行结束后发生
go          用于并发执行
map         定义map类型
struct      定义结构体
chan        定义通道类型
else        用于if-else结构
goto        用于无条件跳转
package     定义包
switch      用于多路分支
const       定义常量或常量组
fallthrough 用于switch语句,使得控制流穿透到下一个case
if          条件语句
range       用于循环遍历数组、切片、字符串、map或通道
type        定义新的数据类型或类型别名
continue    跳过当前循环的剩余部分,开始下一次迭代
for         循环语句
import      导入包
return      从函数返回
var         声明变量

关键字示例

// 使用if-else关键字
if x > 10 {
    fmt.Println("x is greater than 10")
} else {
    fmt.Println("x is not greater than 10")
}

// 使用for关键字
for i := 0; i < 5; i++ {
    fmt.Println(i)
}

// 使用func和return关键字
func add(a int, b int) int {
    return a + b
}

具名的函数

file
在Go语言中,函数是一组执行特定任务的代码块,具名函数即是有名称的函数。本文将详细讨论Go中各类具名函数,包括常规函数、方法、高阶函数、匿名函数和闭包。

常规函数

这是最基础的函数类型。常规函数具有名称,可以接受参数,并且可以返回值。

代码示例

// 常规函数,接受两个int类型参数,返回int类型值
func add(a int, b int) int {
    return a + b
}

方法

在Go中,方法是一种特殊类型的函数,它作用于特定类型的变量,这个特定类型称为接收者。

代码示例

type Circle struct {
    Radius float64
}

// Circle类型的方法,计算圆的面积
func (c Circle) Area() float64 {
    return 3.14159 * c.Radius * c.Radius
}

高阶函数

高阶函数是接受函数作为参数或返回一个函数的函数。

代码示例

// 高阶函数,接受一个函数作为参数
func applyFunc(f func(int) int, value int) int {
    return f(value)
}

匿名函数与Lambda表达式

匿名函数是没有名字的函数,通常用于临时操作。

代码示例

// 匿名函数
add := func(a, b int) int {
    return a + b
}

闭包

闭包是一个函数值,它引用了其函数体之外的变量。简单来说,这个函数“记住了”这些引用的变量。

代码示例

// 闭包示例
func outer() func() int {
    x := 0
    return func() int {
        x++
        return x
    }
}

具名的值

file
在Go语言中,具名的值主要包括变量和常量。这些都是用于存储数据或代表特定值的标识符。接下来,我们会分别探讨变量和常量的各种类型和用法。

变量

变量是用于存储数据的容器。在Go中,变量的声明有多种方式,并且支持多种数据类型。

基本数据类型

Go支持一系列基本的数据类型,包括整数、浮点数、布尔值、字符串等。

var i int = 10          // 整数
var f float64 = 10.5    // 浮点数
var b bool = true       // 布尔值
var s string = "hello"  // 字符串

复合数据类型

Go还提供了数组、切片、映射(Map)、结构体(Struct)等复合数据类型。

var arr [3]int = [3]int{1, 2, 3}           // 数组
var slice []int = []int{1, 2, 3}           // 切片
var m map[string]int = map[string]int{"a": 1, "b": 2} // 映射
type Person struct {Name string; Age int}   // 结构体

指针类型

Go语言也支持指针,但不支持指针运算。

var p *int
i := 42
p = &i

常量

与变量不同,常量是不可变的值,一旦声明,就不能更改。

基本常量类型

const pi float64 = 3.14159  // 浮点数常量
const str string = "Hello"  // 字符串常量
const b bool = true         // 布尔常量

枚举常量

在Go中,可以使用iota关键字生成一组增量的整数常量,通常用于枚举。

type Weekday int
const (
    Sunday Weekday = iota
    Monday
    Tuesday
)

常量表达式

Go支持常量表达式,允许用于计算的常量值在编译期间进行运算。

const x = 2 + 3

定义类型和类型别名

Go语言不仅提供了一系列内建类型,还允许通过type关键字定义新的类型或为现有的类型创建别名。这两者在语法上可能相似,但在类型系统中有不同的意义和用途。本篇文章旨在详细介绍定义类型和类型别名的各种情况。

类型定义(Type Definition)

通过类型定义,你可以创建一个全新的类型,尽管它可能与某个现有类型在结构上完全相同。

基础类型

下面是如何定义一个基于int的新类型MyInt

type MyInt int

复合类型

也可以基于复合类型来定义新类型:

type MyMap map[string]int
type Person struct {
    Name string
    Age  int
}

接口类型

你还可以定义接口类型,它包含了一组方法签名:

type Writer interface {
    Write([]byte) (int, error)
}

类型别名(Type Alias)

类型别名并不创建新类型,只是为现有类型创建一个新名字。

type Integer = int

类型定义与类型别名的区别

类型定义和类型别名在Go中有着本质的区别。

  • 类型定义会创建一个全新的类型,它与其基础类型在类型系统中是完全不同的。
  • 类型别名只是创建了一个新名称,但并没有创建新类型。

代码示例

type MyInt int
type YourInt = int

var a int
var b MyInt
var c YourInt

a = 1
b = MyInt(a)  // 需要显式转换
c = a        // 不需要转换,因为YourInt只是int的别名

包和模块管理

file
Go语言通过包(Packages)和模块(Modules)来组织和管理代码。这两者虽然在目的上有些许相似,但在用法和规模上各有特点。在本篇文章中,我们将深入探讨Go中的包和模块管理,以及如何高效地使用它们。

包(Packages)

包是Go语言代码组织的基本单位。每个Go程序都是由包组成的,包用于封装代码以实现可重用和可维护。

标准库包

Go语言提供了丰富的标准库,例如 fmt, net/http, io 等。

import "fmt"

func main() {
    fmt.Println("Hello, world!")
}

自定义包

你也可以创建自定义的包。通常情况下,每个文件夹就是一个单独的包。

例如,创建一个名为 mathutils 的包:

// mathutils/add.go
package mathutils

func Add(a, b int) int {
    return a + b
}

使用自定义包:

import "mathutils"

func main() {
    sum := mathutils.Add(1, 2)
}

包的可见性

在Go中,以大写字母开头的函数或变量在包外是可见的(Public),以小写字母开头的则不是(Private)。

模块(Modules)

模块是包的集合。Go 1.11版本引入了模块的概念,旨在解决依赖管理问题。

初始化模块

使用 go mod init 初始化一个新模块。

go mod init mymodule

这将生成一个 go.mod 文件,其中列出了模块名和依赖。

添加依赖

当你导入一个新的包并运行 go buildgo get,依赖将自动添加到 go.mod 文件。

升级和降级依赖

你可以使用 go get 命令升级或降级模块依赖。

go get -u example.com/some/module@v1.2.3

代码块与断行

在Go编程中,理解如何有效地使用代码块和断行是编写可读、可维护代码的基础。在本篇文章中,我们将深入了解Go语言中各种类型的代码块和断行规则。

代码块(Code Blocks)

代码块是由一对大括号{}包围的代码序列。这些代码块在不同的语境中有不同的作用。

函数体

最常见的代码块是函数体,它包含函数的实现。

func sayHello() {
    fmt.Println("Hello!")
}

控制结构

ifforswitch 等控制结构也使用代码块。

if true {
    fmt.Println("This is true.")
}

for i := 0; i < 3; i++ {
    fmt.Println(i)
}

声明块

常量和变量也可以在块内声明。

const (
    Pi = 3.14
    E  = 2.71
)

断行(Line Breaks)

Go语言相对宽松的断行规则让你可以在多数表达式和声明中自由地添加空白和换行。

语句结束

在Go中,大多数语句通过换行符或者分号来结束。

fmt.Println("This is the end of the statement")

长语句的断行

对于较长的语句,Go允许在操作符附近断行。

result := someVeryLongVariable +
    anotherVeryLongVariable -
    yetAnotherVeryLongVariable

函数调用和定义

在函数调用或定义时,参数也可以进行断行。

func longFunction(
    param1 int,
    param2 string,
    param3 float64,
) {
    // 函数体
}

总结

通过深入探讨Go语言的标识符、关键字、具名函数、具名值、定义类型、类型别名、包和模块管理,以及代码块和断行,本系列文章旨在提供一个全面且深入的视角来理解Go编程的各个方面。这些元素共同构成了Go语言的基础架构,熟练掌握它们是编写可维护、高效和可扩展代码的关键。希望这些内容能够帮助你在Go编程道路上更进一步,敬请期待我们接下来更多的深入文章和教程。

关注TechLeadCloud,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

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

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

相关文章

学过的汇编指令整合

1.数据搬移指令 <opcode>{<cond>}{s} <Rd>, <shifter_operand> 解释&#xff1a; <opcode>&#xff1a;指令码 {<cond>}&#xff1a;条件码 {s}&#xff1a;状态位&#xff0c;如果在指令后面加上s&#xff0c;则运算的结果会影响CPSR的条…

Docker命令起别名

1.打开.bashrc文件 vi ~/.bashrc 2. 起别名 alias dpsdocker ps --format "table{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}" alias disdocker images 3. 文件生效 source ~/.bashrc 4.展示

计算机竞赛 目标检测-行人车辆检测流量计数

文章目录 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 行人车辆目标检测计数系统 …

2023年全国控制科学与工程学科评估结果 - 自动化考研

考研选择学校时&#xff0c;控制科学与工程考研学校排名情况怎样是广大考研学子十分关心的问题&#xff0c;以下是我们自动化考研联盟为大家整理得最新控制科学与工程学科评估结果情况&#xff0c;还比较权威&#xff0c;供大家参考。 最后祝大家一战成硕,有其他问题欢迎评论区…

【前段基础入门之】=>CSS浮动

浮动的简介 在最初&#xff0c;浮动是用来实现文字环绕图片效果的&#xff0c;现在浮动是主流的页面布局方式之一。 元素浮动后的特点 &#x1f922; 脱离文档流。&#x1f60a; 不管浮动前是什么元素&#xff0c;浮动后&#xff1a;默认宽与高都是被内容撑开&#xff08;尽…

数字IC前端学习笔记:数字乘法器的优化设计(进位保留乘法器)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 阵列乘法器设计中限制乘法器速度的是随着数据位宽而迅速增大的串行进位链&#xff0c;如果使用进位保留加法器&#xff0c;则可以避免在设计中引入较长时间的等待&…

springmvc中DispatcherServlet关键对象

以下代码为 spring boot 2.7.15 中自带的 spring 5.3.29 RequestMappingInfo 请求方法相关信息封装&#xff0c;对应的信息解析在 RequestMappingHandlerMapping 的 createRequestMappingInfo() 中实现。 对于 RequestMapping 赋值的相关信息进行解析 protected RequestMappi…

淘宝天猫渠道会员购是什么意思?如何开通天猫淘宝渠道会员购有什么用?

淘宝天猫渠道会员购是什么意思&#xff1f; 淘宝天猫渠道会员购与淘宝天猫粉丝福利购意思基本相同&#xff0c;都可以领取淘宝天猫大额内部隐藏优惠券、通过草柴APP开通绑定渠道会员还可以获得购物返利。 草柴APP如何绑定开通淘宝天猫渠道会员&#xff1f; 1、手机下载安装「…

GRACE-FO L2产品的发布说明 - 版本UTCSR RL-06.1产品

数据更新日期&#xff1a;2023-5-11 0&#xff09;此说明取代了所有先前与UTCSR-RL06.1 GRACE-FO Level-2产品相关的旧版本发布说明。 1&#xff09;截止到本发布说明日期的GRACE-FO RL-06.1产品文件列表如下&#xff1a; 2&#xff09;通常情况下&#xff0c;每个日历月有四…

vscode 无法打开源文件

以下是c/c插件的intelligense设置情况&#xff1a; 解决办法&#xff1a; 重新安装vsode无用&#xff1b;重新下载mingw64&#xff0c;管用了&#xff01;&#xff08;我猜可能是之前换电脑移植文件的时候导致了部分文件丢失&#xff09;

【LLM】主流大模型体验(文心一言 科大讯飞 字节豆包 百川 阿里通义千问 商汤商量)

note 智谱AI体验百度文心一言体验科大讯飞大模型体验字节豆包百川智能大模型阿里通义千问商汤商量简要分析&#xff1a;仅从测试“老婆饼为啥没有老婆”这个问题的结果来看&#xff0c;chatglm分点作答有条理&#xff08;但第三点略有逻辑问题&#xff09;&#xff1b;字节豆包…

普通人需要做副业吗?有什么合适的副业

普通人现在需要做副业吗&#xff0c;我觉得有这个必要&#xff0c;当然也要根据个人情况选择&#xff0c;那么做副业有什么好处呢&#xff1f;做副业可以带来额外的收入&#xff0c;增加灵活性&#xff0c;提升技能&#xff0c;发展创造力&#xff0c;降低风险&#xff0c;提供…

(黑客)网络安全———自学方法

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…

YoloV5实时推理最短的代码

YoloV5实时推理最简单代码 import cv2 import torch# 加载YOLOv5模型 model torch.hub.load(ultralytics/yolov5, yolov5s)# 使用CPU或GPU进行推理 device cuda if torch.cuda.is_available() else cpu model.to(device)# 打开摄像头&#xff08;默认摄像头&#xff09; cap…

【论文笔记】Diffusion-based 3D Object Detection with Random Boxes

原文链接&#xff1a;https://arxiv.org/abs/2309.02049 1. 引言 基于激光雷达的3D目标检测方法通常依赖经验设置锚框或中心半径&#xff0c;而本文探索从随机框直接预测真实边界框。   本文提出Diff3Det&#xff0c;使用扩散模型进行3D目标检测。首先为真实边界框添加高斯噪…

[论文必备]最强科研绘图分析工具Origin(1)——安装教程

之前在论文中pr曲线和loss曲线对比用到了Origin这个最强科研绘图分析工具&#xff0c;被导师狠狠夸了&#xff0c;下面来分享一下~ 本篇先带你手把手安装这个软件&#xff0c;可以先点再慢慢看哦~ 目录 &#x1f4e2;一、软件简介 &#x1f33b;二、安装教程 &#x1f384…

想要精通算法和SQL的成长之路 - 验证二叉搜索树和不同的二叉搜索树

想要精通算法和SQL的成长之路 - 验证二叉搜索树和不同的二叉搜索树 前言一. 验证二叉搜索树二. 不同的二叉搜索树三. 不同的二叉搜索树II 前言 想要精通算法和SQL的成长之路 - 系列导航 二叉搜索树的定义&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包…

Docker中将静态页面部署nginx

1.启动nginx docker start nginx 2.进入nginx cd /usr/share/nginx/html 3.vim index.html 说明&#xff1a;没有vim命令&#xff0c;docker镜像只保留了基本的功能&#xff08;文件&#xff09;。 4.解决方法 数据卷&#xff1a;是一个虚拟目录&#xff0c;是容器内目录与…

山西电力市场日前价格预测【2023-10-04】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-04&#xff09;山西电力市场全天平均日前电价为311.79元/MWh。其中&#xff0c;最高日前电价为427.05元/MWh&#xff0c;预计出现在18: 45。最低日前电价为249.76元/MWh&#xff0c;预计…

Linux apt-get update - Could not connect to XXX(Connection refused)

Linux: apt-get update ----Err:Could not connect to XXX(Connection refused) - 知乎 先换源&#xff08;vi不好使用&#xff0c;可以换成gedit&#xff09; 若还是不行&#xff0c;可以再尝试执行&#xff1a; unset http_proxy unset https_proxy