go基础1-程序结构

go

go的编程原则是简洁.

具备功能:

  1. 自动垃圾回收
  2. 一个包系统
  3. 函数是一等公民
  4. 语法作用域
  5. 系统调用接口
  6. 只读的UTF8字符串
  7. 类型系统,内置数据类型,聚合类型
  8. 标准库

不包含特性:

  1. 没有隐式的数值转换
  2. 没有构造函数和析构函数
  3. 没有运算符重载
  4. 没有默认参数
  5. 没有继承
  6. 没有泛型
  7. 没有异常
  8. 没有宏
  9. 没有函数修饰
  10. 没有线程局部存储

程序结构

  • 命名

a.名字必须字母或下划线开头,后面可以跟任意数量的字母数字下划线.
b.区分大小写.大写代表公有,小写代表私有.
c.推荐驼峰命名
d.不可以用于命名的情形

关键字:
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

预定义名字:
内建常量: true false iota nil

内建类型: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error

内建函数: make len cap new append copy close delete
complex real imag
panic recover

  • 声明

声明语句:var,const,type,func对应为变量,常量,类型,函数实体对象

go文件定义顺序:包声明,import语句,包级声明

函数声明:名字,参数列表,[可选的返回值列表,]函数体

  • 变量

a. var 变量名字 [类型 = 表达式]

类型和表达式都可以省略.省略类型时,会更加初始化表达式来推导类型;省略表达式则用零值初始化该变量;
如果变量名为下划线_则表示丢弃该值.

b. 各个变量类型零值取值:

数值类型:0    
布尔类型:false    
字符串:""    
接口或引用类型(slice,指针,map,chan,函数):nil

c. 初始化时点

初始化表达式可以是字面量或任意的表达式.包级别声明的变量在main入口函数执行前初始化;局部变量在执行时初始化;

d. 简短变量声明: 名字 := 表达式

e. 指针
指针:对应变量在内存中存储位置.一个变量对应一个保存了变量对应类型值的内存空间,用于存储变量表达式.而指针就是用于定位该内存空间地址.通过&变量名来定位变量地址,通过*指针名来获取变量表达式值.

x := 1
p := &x
fmt.Println(*p)

每次对变量取地址或复制地址,都会为原变量创建新的别名.如"*p就是x的别名.不仅指针会创建别名,其他很多引用类型也会创建别名.

f.变量的生命周期

变量的生命周期:变量在程序运行期间有效存在的时间段.包级别变量生命周期和整个程序运行周期相同;局部变量是从声明到不再被引用.
如果局部变量被包级别变量引用,造成变量声明周期变化的情形称为变量逃逸.
go自动垃圾收集器会的实现思路:通过指针或引用的访问路径遍历所有变量,
看是否可以找到该变量,如果不存在访问路径,则说明该变量不可达,即它是否存在不影响程序运行,则进行回收.因此变量逃逸行为会影响垃圾回收,要注意自己变量定义赋值的合理性.

  • 赋值

赋值语句用于更新变量值,格式是将被赋值变量放在=左边,值在右边.

x = 1

元组赋值:就是将一组值进行赋值.赋值前,赋值语句右边的所有表达式将会先进行求值,然后统一更新左边的对应的值.

x,y = y,x 等价于 x=y,y=x

赋值语句左边变量和右边的值必须有相同的数据类型才能进行赋值操作.

  • 类型

类型就是变量的数据结构,用于定义存储方式,大小,操作符,方法集等;

类型声明语句用于自定义底层类型结构.区分不同概念的类型,让代码更具有语义性.一般出现于包级,类型名称大写代表外部可访问.

type 类型名称 底层类型
  • 包和文件

go的包和其他语言的库或模块类似.用于支持模块化,封装,单独编译和代码重用.
每个包都对应一个独立的命名空间.同一个包下的文件间类型和常量共享.(小写也可以共享吗?)

每个源文件的包声明前都跟着包注释.包注释的第一句应该是包功能概述.一个包通常只有一个源文件有包注释.如果包注释很大,通常放到单独的doc.go文件里.

包导入时会强制进行依赖校验

包的初始化

包内文件的初始化是按照发给编译器的顺序进行.go语言构建工具先按文件排序,然后依次调用编译器编译.
初始化过程:如果有初始化表达式则按表达式初始化,没有则使用特殊的init初始化函数.
初始化函数除了不能被调用和引用外,其他行为和普通函数一致.
每个包只被初始化一次,自下向上进行,main包最后初始化.

  • 作用域

声明语句将实体和名称关联,它的作用域就是可以有效使用该名字的范围.

作用域和声明周期:
作用域是源代码的文本区域,它是编译时属性;
生命周期是程序运行时变量存在的有效时间段,是一个运行时概念;

句法块是由花括号所包含的一系列语句.句法块内部声明的名称无法被外部访问.类似的,我们将代码种未显式使用花括号包裹的语句称为词法块;对于全局源代码来说,存在一个整体的词法块,称为全局词法块.

编译器遇到可以定义不同语法块的同名变量.当编译器遇到一个名称引用时,它会从词法域由内到外查找,查找失败则报告"未声明的名字"错误.

原文地址:https://www.cnblogs.com/chengmuyu/p/13406881.html