Go开始:Go基本元素介绍

标识符与关键字

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 := 0return 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 = iotaMondayTuesday
)

常量表达式

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

const x = 2 + 3

定义类型和类型别名

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

类型定义(Type Definition)

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

基础类型

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

type MyInt int

复合类型

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

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

接口类型

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

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

类型别名(Type Alias)

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

type Integer = int

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

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

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

代码示例

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

包和模块管理

file


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

包(Packages)

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

标准库包

Go语言提供了丰富的标准库,例如 fmtnet/httpio 等。

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

自定义包

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

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

// mathutils/add.go
package mathutilsfunc 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 build 或 go 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.14E  = 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,
) {// 函数体
}

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

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

相关文章

如何使用BERT生成单词嵌入?

阿比贾特萨拉里 一、说明 BERT&#xff0c;或来自变形金刚&#xff08;Transformer&#xff09;的双向编码器表示&#xff0c;是由谷歌开发的强大语言模型。它已广泛用于自然语言处理任务&#xff0c;例如情感分析、文本分类和命名实体识别。BERT的主要特征之一是它能够生成单词…

Servlet的生命周期

2023.10.18 WEB容器创建的Servlet对象&#xff0c;这些Servlet对象都会被放到一个集合当中&#xff08;HashMap&#xff09;&#xff0c;这个集合当中存储了Servlet对象和请求路径之间的关系 。只有放到这个HashMap集合中的Servlet才能够被WEB容器管理&#xff0c;自己new的Ser…

【经历】跨境电商公司目前已在职近2年->丰富且珍贵

我入职了跨境电商公司 *背景 上篇说我在2021-11月离职了&#xff0c;交接期间已经拿到了新公司的offer&#xff0c;然后因上家公司项目交接时间比较长(原因在上篇)&#xff0c;导致新公司这边延迟了两次入职的时间&#xff0c;最后结果是直接无缝衔接了新公司&#xff08;周五…

HTML5有哪些新特性?移除了哪些元素?

HTML5引入了许多新特性&#xff0c;以下是其中一些主要的新特性&#xff1a; 1&#xff1a;语义化元素&#xff1a;HTML5引入了一些新的语义化元素&#xff0c;如 <header>、<footer>、<nav>、<article>、<section>等&#xff0c;使得页面结构…

Python学习第3天-第一个Python程序

文章目录 前言一、创建项目二、创建程序总结 前言 下面给大家展示下经典的Hello World! 一、创建项目 二、创建程序 print("Hello World!")总结 回到顶部 学习网站 欢迎来到Python的世界&#xff01;

从头开始机器学习:逻辑回归

一、说明 本篇实现线性回归的先决知识是&#xff1a;基本线性代数&#xff0c;微积分&#xff08;偏导数&#xff09;、梯度和、Python &#xff08;NumPy&#xff09;&#xff1b;从线性方程入手&#xff0c;逐渐理解线性回归预测问题。 二、逻辑回归简介 我们将以我们在线性回…

C嘎嘎之类和对象上

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;掌握类的引用和定义&#xff0c;熟悉类成员函数的…

arrow(c++)改写empyrical系列1---用arrow读取基金净值数据并计算夏普率

用arrow c版本读取了csv中的基金净值数据&#xff0c;然后计算了夏普率&#xff0c;比较尴尬的是&#xff0c;arrow c版本计算耗费的时间却比python的empyrical版本耗费时间多。。。 arrow新手上路&#xff0c;第一次自己去实现功能&#xff0c;实现的大概率并不是最高效的方…

【(数据结构)— 双向链表的实现】

&#xff08;数据结构&#xff09;— 双向链表的实现 一.双向链表的结构二. 双向链表的实现2.1 头文件 ——双向链表的创建及功能函数的定义2.2 源文件 ——双向链表的功能函数的实现2.3 源文件 ——双向链表功能的测试2.4 双向链表各项功能测试运行展示2.4.1 双向链表的初始化…

git切换远程仓库源步骤

git切换远程仓库源步骤&#xff1a; 第一步&#xff1a;git remote -v 查看当前远程仓库源&#xff1a; 第二步&#xff1a;git remote rm origin删除远程仓库源&#xff1b; 第三步&#xff1a;git remote add origin http://newURL.git 添加新的远程仓库源地址&#xff1b…

云安全—分布式基础

0x00 前言 云必然是依赖于分布式技术来进行实现的&#xff0c;所以有必要学习和来了解分布式相关的内容 0x01 分布式计算 1.基本概述 分布式计算的定义&#xff1a;通过网络互联的计算机都具有一定的计算能力&#xff0c;他们之间互相传递数据&#xff0c;实现信息共享&…

用3D扫描生成合成数据

合成数据集&#xff08;Synthetic Datasets&#xff09;正在成为计算机视觉模型训练的标准部分。 虽然新工具使合成数据集变得更容易访问&#xff0c;但除了标准机器学习过程之外&#xff0c;许多工具还需要对 3D 建模有基本的了解。 最简单的捷径是从现实世界中获取现有对象并…

Vue中的v-if和v-show指令有什么区别?

在Vue中,v-if和v-show是两个常用的指令,用于根据条件控制元素的显示和隐藏。虽然它们都可以根据条件来切换元素的可见性,但它们的实现和行为有一些区别。 1:编译时机: v-if是在编译阶段进行条件判断,如果条件为false,则在DOM中不会渲染该元素及其子元素;v-show则是在运…

基于材料生成优化的BP神经网络(分类应用) - 附代码

基于材料生成优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于材料生成优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.材料生成优化BP神经网络3.1 BP神经网络参数设置3.2 材料生成算法应用 4.测试结果…

28 mysql 数据记录的 存储更新删除

前言 前面 我们探讨了 索引记录的 新增, 更新, 删除 这里 我们来看一下 mysql 的核心数据记录的 新增更新删除 这里 来看一下 增删改 的相关实现 数据记录 和 索引记录 的处理方式是一致的 mysql 数据记录的存储 新增部分参见 自增长主键的实现 以及 记录的插入 mysql…

keep-alive 是 Vue 的一个内置组件,用于缓存其他组件的实例,以避免重复渲染和销毁,它可以在需要频繁切换的组件之间提供性能优化

目录 keep-alive 使用 keep-alive 的示例代码&#xff1a; 手动清除组件缓存的示例代码&#xff1a; keep-alive 组件有以下几个优点&#xff1a; keep-alive 的原理&#xff1a; 使用 keep-alive 组件&#xff0c;你可以包裹需要缓存的组件&#xff0c;然后这些组件在切…

1.3 矩阵

一、向量与矩阵 下面是三个向量 u \boldsymbol u u、 v \boldsymbol v v、 w \boldsymbol w w&#xff1a; u [ 1 − 1 0 ] v [ 0 1 − 1 ] w [ 0 0 1 ] \boldsymbol u\begin{bmatrix}\,\,\,\,1\\-1\\\,\,\,\,0\end{bmatrix}\kern 10pt\boldsymbol v\begin{bmatrix}\,\,\,…

RemObjects Elements 12.0 Crack

Elements 是一个现代多功能软件开发工具链。 它支持六种流行的编程语言&#xff1a;Oxygene (Object Pascal)、C#、Java、Mercury (Visual Basic.NET™)、Go 和 Swift&#xff0c;适用于所有现代平台。 使用 Elements&#xff0c;您可以为您喜欢的任何平台进行编程- 无论是单…

基于Ubuntu Server编译YTM32 SDK工程

基于Ubuntu Server编译YTM32 SDK工程 文章目录 基于Ubuntu Server编译YTM32 SDK工程需求下载软件包安装与配置配置虚拟机联网模式启用ssh连接启用ftp连接安装armgcc编译工具链确认make工具 验证 需求 在Linux系统环境下搭建SDK的编译环境&#xff1a; 方便加入到持续集成工具…