当前位置: 首页 > news >正文

Go程序结构

Go程序结构

1、名称

​ 名称的开头是一个字母下划线,且区分大小写

实体第一个字母的大小写决定其可见性是否跨包:

​ 若名称以大写字母开头,它是导出的,对包外是可见和可访问的,可以被自己包以外的其他程序所引用,比如fmt包中的Printf。

包名本身总是由小写字母组成的。

一般使用驼峰式命名;

像ASCII和HTML这样的首字母缩写词通常使用相同的大小写,如html,而不是Html;

2、声明

​ 声明是给一个程序实体命名,并且设定其部分或者全部属性。

有四个主要的声明:

变量(var)、常量(const)、类型(type)、函数(func);

go程序存储在一个或多个以.go为后缀的文件里;

每一个文件以package声明开头,表明文件属于哪个包;接着是import声明

3、变量

​ var声明创建一个具体类型的变量,给它一个附加的名字,设置它的初始值。

var name type = expression
//类型和表达式部分可以省略一个,但不能都省略
var s string  //""
var b = true //bool

Go中所有变量都是初始化的,若未设置初始值,则为零值

类型默认零值
数字(int、float)0
布尔型 (bool)false
接口和引用类型(slice、指针、map、通道、函数)nil
复合类型(数组或者结构体)零值是所有元素的零值
3.1、短变量声明

​ 短变量声明可以用来声明和初始化局部变量

name := expression
//name的类型由expression决定
i := 100 //一个int类型的变量
// := 表示声明, = 表示赋值

​ var声明通常是为那些跟初始化表达式类型不一致的局部变量保留的,或者用于后面才对变量赋值以及变量初始值不重要的情况。

​ 短变量声明不需要声明所有在左边的变量;

3.2、指针

​ 变量是存储值的地方;

​ 指针的值是一个变量的地址,不是所有的值都有地址,但是所有的变量都有。

​ 使用指针可以在无须知道变量名字的情况下,间接读取或更新变量的值。

x := 1
p := &x  // p是整型指针,指向x
fmt.Println(*p) // 1 , *p获取变量的值
*p = 2 //p指向的变量写成*p, *p代表一个变量, 本式等于 x = 2
fmt.Println(x)
3.3、new函数

​ 另一种创建变量的方式是使用内置的new函数,表达式new(T),创建一个未命名的t类型变量,初始化为T类型的零值,并返回其地址(*T)

p := new(int) // *int类型的p,指向未命名的int变量,new函数返回 *int
fmt.Println(*p) //输出“0”
*p = 2 

note: 使用new创建的变量和取其地址的普通局部变量没有什么不同,只是不需要引入一个虚拟的名字。通过new(T)就可以直接在表达式中使用,故只是语法上的便利。

new是一个预声明的函数,不是一个关键字,使用的相对较少。

4.赋值

​ 赋值语句用来更新变量所指的值,赋值符号 “=” 。

​ 多重赋值,允许几个变量一次性被赋值;(在实际更新变量前,右边所有的表达式被推演)

5、类型声明

​ 变量或表达式的类型定义这些值应有的特性,例如大小、在内部如何表达、可以对其进行何种操作以及它们所关联的方法

​ type声明定义一个新的命名类型,它和某个已有类型使用同样的底层类型。

type name underlying-type
type Celsiue float64 //定义类型Celsiue

note:对于每个类型T,都有一个对应的类型转换操作T(x)将值x转换为类型T。如果两个类型具有相同的底层类型或者二者都是指向相同底层类型变量的未命名指针类型,则二者是可以相互转换的。

6、包初始化

func init() {/*...*/}

在每一个文件里,当程序启动时,init函数按照它们声明的顺序自动执行,init函数不能被调用和被引用;

http://www.lryc.cn/news/98866.html

相关文章:

  • JAVA面试总结-Redis篇章(四)——双写一致性
  • 赋能医院数字化转型,医院拍摄VR全景很有必要
  • Vue3项目中没有配置 TypeScript 支持,使用 TypeScript 语法
  • 数据可视化大屏拼接屏开发实录:屏幕分辨率测试工具
  • 每日一题7.28 209
  • Python + Playwright 无头浏览器Chrome找不到元素
  • C++信号量与共享内存实现进程间通信
  • [Tools: Camera Conventions] NeRF中的相机矩阵估计
  • 【sgUpload】自定义上传组件,支持上传文件夹及其子文件夹文件、批量上传,批量上传会有右下角上传托盘出现,支持本地上传图片转换为Base64image
  • Kafka 实时处理Stream与Batch的对比分析
  • Andriod开发性能优化实践
  • linux环境安装mysql数据库
  • 【深度学习中常见的优化器总结】SGD+Adagrad+RMSprop+Adam优化算法总结及代码实现
  • 山东大学软件学院考试回忆——大二上
  • 【Express.js】异常分类和日志分级
  • k8s webhook实例,java springboot程序实现 对Pod创建请求添加边车容器 ,模拟istio实现日志文件清理
  • 关于electron的问题汇总
  • ps 给衣服换色
  • AI人工智能未来在哪里?2023年新兴产业人工智能有哪些就业前景?
  • 组件间通信案例练习
  • 【matlab】机器人工具箱快速上手-正运动学仿真(代码直接复制可用)
  • 论文解读|PF-Net:用于 3D 点云补全的点分形网络
  • 网络安全(零基础)自学
  • Spring Security 身份验证的基本类/架构
  • 市值超300亿美金,SaaS独角兽Veeva如何讲好中国故事?
  • 编译内联导致内存泄漏的问题定位修复
  • 基于WebSocket实现的后台服务
  • Go语言中的结构体详解
  • pytest自动化测试指定执行测试用例
  • 英伟达 H100 vs. 苹果M2,大模型训练,哪款性价比更高?