Go语言程序设计(一)Go语言概述及基础

news2024/10/5 21:22:11

一、前言

        为了尽可能获得最佳的运行性能,Go语言被设计成一门静态编译型的语言,而不是动态解释型的。Go语言的编译速度非常快,明显的要快过其他同类语言,比如C和C++。

Go语言的官方编译器被称为gc。

Go语言具有以下几个特点:

  1. 快速编译
  2. 并发设计易于实现
  3. 高效的垃圾回收机制

二、Go程序结构

        Go程序是以包(package)的形式来组织的,这和Python语言类似。Go程序一般由三部分组成:包声明部分、第三方包导入部分和函数声明部分。

  • Go语言使用关键字“package"声明要创建的包;
  • 使用关键字“import"导入第三方包;
  • 使用关键词“func”声明要创建的函数。

1、本地包声明

包是组成Go程序的基本单位,所以每个Go程序源代码的开始都是一个包声明(Package Declaration),格式如下:

package < pkgName >

包声明的关键字是“package",pkgName告诉编译器当前文件属于哪个包。当要生成
一个可执行的Go程序时,必须建立一个名为main的包,并且在该包中应包含一个名为
main的函数,main函数是Go程序运行时的人口。
除了main包之外,其他名称的包里不能包含main函数,且编译后都会生成*.a文件(也就是包文件),并被自动存放在pkg文件夹中。需要注意的是,一个可执行程序,有且仅有一个main包,一个main包有且仅有一个main函数。


2、第三方包导入

        在包声明之后,如果需要调用Go标准库函数(这些标准库函数通常封装在第三方包中),还要使用关键字“import”导人第三方包,这就是包的导入(Package Import),但必须是非main包。在Go语言中,包的导入有三种模式:正常模式、别名模式和简便模式。

(1)正常模式

在正常模式中,第三方包导入格式如下:

import < pkgName >

import是包声明关键字,pkgName告诉编译器要导入哪个包。包导入之后,就可以使用下面的语句格式对包中的函数或类型进行调用:

< pkgName >. < funcName >

本例要调用fmt包的Println方法输出信息,所以调用语句为:
fmt. Println( .. )

(2)别名模式

在别名模式中,当要使用第三方包时,包名可能会非常接近或者相同,
此时就可以使用别名来进行区别和调用,导入格式如下:

import 别名 < pkgName >

(3)简便模式

在简便模式中,可以直接使用funcName进行第三方包的调用,不需要pkgName,导入格式如下:

import . < pkgName >

简便模式和别名模式同时使用时容易混淆,不建议使用。import语句在其他编程语言中都有类似的概念,比如在C中,“包"的概念被称为“库”,调用时使用include语句包含到C程序中。
需要注意的是,如果导入一个包之后,源程序并未调用包里的函数或类型,则编译时会报错。这其实是Go语言实现快速编译的一种机制,Go在编译源文件之前,编译器会对所有导入的包进行检查,看它是否和源文件之间有关联,如果没有关联就是没用的,则不允许导入。这样可以保障源代码体积是最小的,也可以加快编译速度。

3、函数声明

        和其他高级程序设计语言一样(比如C语言),Go程序的真正执行体也是函数,所以每个Go程序至少应声明一个main函数。函数声明以关键字func开头,格式如下:

func funcName(参数列表)(返回值列表){
//函数体
}

与其他函数不同,Go程序中的main函数既没有参数,也没有返回值。如果在命令行中要向main传入参数,可在os. Args变量中保存。另外,Go函数还支持多返回值,在后面的章节中介绍。

三、Go程序语言要点

示例代码:helloworld.go

package main

import (
	"fmt"
)

func main() {

	fmt.Printf("Hello World! 你好,世界!")

}
  • 1、Go语句中的分号

        通过helloworld. go还可以看到Go程序语句里没有分号。其实,和C语言一样,Go语言的正式语法也使用分号来终止语句。和C语言不同的是,这些分号由词法分析器在扫描源代码过程中使用简单的规则自动插入,因此输入源代码多数时候就不需要分号了。Go程序中,出现分号的典型位置是在for循环的分隔语句或类似之处。

  • 2、左大括号的约定

        Go语言规定,函数、控制结构(if、for、switch或select)等的左大括号“{”,“必须和函数声明或控制结构放在同一行”。如果将左大括号“放在函数声明,控制语句的下一行”,编译器会在左大括号的前方自动插人一个分号,这可能导致异常的结果。

  • 3、Go语言对UTF-8的支持

        最后可以看到输出的内容里面包含中文“你好,世界!”,实际上,Go是天生支持UTF-8的,任何字符都可以直接输出,甚至可以用UTF-8中的任何字符作为标识符,这是因为UTF-8的发明者也就是Go的发明者,所以它天生就具有多语言的支持。

  • 4、可见性规则

        Go语言中,使用大小写来决定常量、变量、类型、接口、结构或函数是否可以被外部包所调用,根据约定:
(1)函数名首字母小写,即为private。
(2)函数名首字母大写,即为public。

四、Go的注释方式

        在Go程序代码中添加注释,是为了让代码阅读起来更容易理解,良好的编码习惯其中就包括为代码加上清晰明确的注释说明。Go程序的注释方式有两种:单行注释和块注释。
1、单行注释
单行注释以“//”开始,一般对单行语句的含义进行说明,可以单独放在一行,也可以跟在代码后,和代码放在同一行。下面是单行注释的例子。

//每个main包有且仅有一个main函数
func main() {
fmt. Println("Hello World!你好,世界!") //函数Println()用于行输出
}

2、块注释
块注释以“/ *”开始,以“* /”结束,经常用于对一个函数或语句块进行说明。下面是注释的例子。

/*
描述:函数main()是一个可执行包的人口函数
参数:无
返回值:无
*/
func main() {
fmt. Println("Hello World!你好,世界!")
}

3、使用注释限制代码执行
注释的一般作用是为代码添加阅读说明,但有时也可以使用注释限制某些语句的执行,使编译器不去处理它。尤其在调试程序的时候非常有用。例如:

func main() {
t: = time.Now() //时间戳
//fmt. Println(t)
/*
fmt. Println(t.String()) //年月日时分秒
fmt. Println(t.Format("2006year 01month 02day")) //年月日
*/
fmt. Println(t.Weekday().String()) //星期几
}

五、Go语言关键字及标识符

        Go标识符是一个非空的字母或数字串,其中第一个字符必须是字母,该标识符也不能是关键字的名字。字母可以是一个下划线,或者Unicode编码分类中的任何字符,如大写字母“Lu”(letter,uppercase)、 小写字母“Ll" (letter, lowercase)、 首字母大写“Lt" (letter, titlecase)、修饰符字母“Lm”(letter, modifier)或者其他字母,“Lo”(etter, other)。 这些字符包含所有的英文字母(A~Z以及a~z)。数字则是Unicode编码"Nd"分类(number, decimal digit)中的任何字符,这些字符包括阿拉伯数字0~9。编译器不允许使用与某个关键字(见表2-1)一样的名字作为标识符。

 

        标识符都是区分大小写的,因此LINECOUNT、Linecount、 LineCount、 lineCount和
linecount是5个不一样的标识符。以大写字母开头的标识符,即Unicode分类中属于“Lu”的字母(包含A~Z),是公开的——以 Go语言的术语来说就是导出的,而任何其他的标识符都是私有的——用 Go语言的术语来说就是未导出的。(这项规则不适用于包的名字,包名约定为全小写。)
        空标识符“_”是一个占位符,它用于在赋值操作的时候将某个值赋值给空标识符,从而达到丢弃该值的目的。空标识符不是一个新的变量,因此将它用于:=操作符的时候,必须同时为至少另一个值赋值。通过将函数的某个甚至是所有返回值赋值给空标识符的形式将其丢弃是合法的。然而,如果不需要得到函数的任何返回值,更为方便的做法是简单地忽略它。这里有些例子:

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

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

相关文章

(css)盒子的阴影

(css)盒子的阴影 效果&#xff1a; 代码&#xff1a; box-shadow: inset 0 0 50px 2px #74eaff;解决参考&#xff1a;https://blog.csdn.net/weixin_52984349/article/details/125803515

docker部署私有化镜像仓库

为什么要部署私有化&#xff1a; 1.防止镜像因为内存不够被驱逐 2.方便内网服务器复用 部署步骤&#xff1a; docker pull registry // 如果嫌麻烦&#xff0c;也可以去我的资源里面去拿现成的&#xff0c;docker load -i registry.tar 到自己的docker里。"""如…

Django搭建图书管理系统02:创建并配置APP功能模块

&#x1f4c1; 创建APP **Django中的APP&#xff08;应用程序&#xff09;是将功能模块组织在一起的单位&#xff0c;每个APP通常负责处理特定的功能。**开发者可以将不同功能的模块放在不同的app中, 方便代码的复用。app就是项目的基石&#xff0c;因此开发博客的第一步就是创…

[C++] C++11新特性介绍 分析(2): lambda表达式、function包装器、bind()接口

文章目录 [toc] C11**lambda 表达式**lambda 表达式lambda 表达式底层 包装器 functionfunction 包装普通可调用对象function 包装类内成员函数 bind()bind() 使用 及 功能1. 调整参数位置2. 绑定参数 C11 上一篇介绍C11常用的新特性只介绍了一部分. 本篇文章继续分析介绍. l…

Linux简介与安装

文章目录 前言一、Linux简介1.Linux是什么2.学完Linux后能做什么 二、Linux安装1.安装方式介绍2.安装Linux3.网卡设置4.安装SSH连接工具5. Linux目录结构 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&…

括号生成(力扣)递归 JAVA

目录 题目描述&#xff1a;纯递归解法&#xff1a;递归 回溯&#xff1a; 题目描述&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a…

《手把手教你》系列基础篇之1-python+ selenium自动化测试-环境搭建(详细)

1.环境搭建 基于python3和selenium3做自动化测试&#xff0c;俗话说&#xff1a;工欲善其事必先利其器&#xff1b;没有金刚钻就不揽那瓷器活&#xff0c;磨刀不误砍柴工&#xff0c;因此你必须会搭建基本的开发环境&#xff0c;掌握python基本的语法和一个IDE来进行开发&…

modelscope魔塔初探--TTS

官网 step1 可以选择指定模型&#xff0c;对于多情感的模型&#xff0c;还可以通过标签实现语气情感 from modelscope.outputs import OutputKeys from modelscope.pipelines import pipeline from modelscope.utils.constant import Taskstext <speak><emotion …

Springboot实现热部署

目录 1、问题阐述 2、实现方式 3、开始配置 3.1在pom.xml中添加依赖 3.2devtools配置 3.3修改IDEA配置 3.4测试一下 1、问题阐述 在实际项目开发过程中&#xff0c;每次修改代码就得将项目重启&#xff0c;重新部署&#xff0c;对于一些大型应用来说&#xff0c;重启时…

特征选择算法 | Matlab实现基于ReliefF特征选择算法的回归数据特征选择 ReliefF

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 特征选择算法 | Matlab实现基于ReliefF特征选择算法的回归数据特征选择 ReliefF 部分源码 %--------------------

五分钟就可以安装MySQL

目录 ⛈️一.什么是MySQL ⛈️二.为什么要使用MySQL ⛈️三.MySQL有什么优点 ⛈️四.官网&#xff1a; ⛈️五.下载 ⛈️六.安装 ⛈️七.查看 ⛈️八.修改密码 一.什么是MySQL MySQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它使用结…

【Python编程系列】1、Python安装

Python安装 1、下载安装包 官网地址:https://www.python.org/ 进入后,在Downloads菜单下选择python运行的系统环境: 以Windows系统为例,进入后,选择合适的版本下载: 2、安装Python软件包 双击可执行文件exe: 弹出安装窗口后: 我们一般选择"Install Now"的…

Linux 配置dns覆盖默认127.0.0.53

Linux dns默认127.0.0.53&#xff0c;在/etc/resolve.conf中存在 nameserver 127.0.0.53&#xff0c;手动修改无果&#xff0c;每次重启依旧127.0.0.53&#xff0c;因为这是系统生成的文件&#xff0c;resolvectl命令来查dns的配置。 要修改dns&#xff0c;先暂停dns服务&…

6 JSR303校验

6.1 加入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency> 6.2 在实体类上加注解 在实体类上加入Validated注解。并且在属性上方加入Emall(messag…

Selenium自动化测试技巧

目录 前言&#xff1a; Selenium自动化 跨浏览器测试中的Selenium 利用正确的定位器 数据驱动的测试 不要依赖特定的驱动程序 选择器顺序 使用PageObjects设计模式 提倡wait避免sleep 关闭Firebug起始页 前言&#xff1a; Selenium是一个广泛使用的自动化测试框架&a…

Android11 Settings加载流程

一、系统设置首页(一级菜单)&#xff1a; 1、Settings 之所以要在此定义空的Activity&#xff0c;是为了外部应用能直接跳转到XX_SettingsActivity界面&#xff0c;因为如果只是fragment的话&#xff0c;外部是没法跳转到fragment界面的&#xff0c;跳转到XX_SettingsActivit…

【无公网IP】在外Windows远程连接MongoDB数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 转载自cpolar极点云文章&#xff1a;公网远程…

Camera API1 使用说明

Camera API2 使用说明 目录 一、开启相机 1.1创建项目 1.2注册权限 1.3配置相机特性要求 1.4 获取摄像头的个数 1.5 根据 ID 获取 CameraInfo facing 1.6 开启相机 1.7 关闭相机 二、预览 2.1认识 Parameters 2.2 设置预览尺寸 2.3添加预览 Surface 2.4 开启和关…

高级篇九、性能分析工具的使用

目录 2、查看系统性能参数3、统计SQL的查询成本&#xff1a;last_query_cost4、 定位执行慢的 SQL&#xff1a;慢查询日志4.1 开启慢查询日志参数4.2 查看慢查询数目4.3 案例演示 2、查看系统性能参数 在MySQL中&#xff0c;可以使用 SHOW STATUS 语句查询一些MySQL数据库服务…

【C++】STL——list介绍及使用

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f681; 个人主页&#xff1a;不 良 &#x1f525; 系列专栏&#xff1a;&#x1f6f8;C &#x1f6f9;Linux &#x1f4d5; 学习格言&#xff1a;博观而约取&#xff0…