golang核心编程

Posted 浅弋、璃鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang核心编程相关的知识,希望对你有一定的参考价值。

文章目录

一、基础知识:

1. 语言简介:

1.2 语言特性:

常见高级语言的语言特性:

语言组织:
所有的高级语言都是用源代码来表达程序, 程序的语法格式千差万别, 但是表达这些语法的基本概念大同小异, 主要包括:

  • 标识符和关键字;
  • 变量和常量;
  • 运算符;
  • 表达式;
  • 简单语句;
  • 控制结构;

类型系统:
每种高级语言都有自己的类型系统, 类型系统的特性主要表现为以下几个方面:

  • 动静特性: 动态语言还是静态语言;
  • 类型强弱: 强类型还是弱类型;
  • 基本数据结构: 包括类型及其支持的运算和操作集合;
  • 自定义数据类型: 包括类型及其支持的运算和操作集合;

抽象特性:

  • 函数: 是否支持函数, 匿名函数, 高阶函数, 闭包等;
  • 面向对象: 是否支持面向对象;
    • 多态: 如何支持多态;
  • 接口: 是否支持接口, 以及接口实现模式;

元编程特性:

  • 泛型: 是否支持泛型;
  • 反射: 是否支持反射, 反射的能力;

运行和跨平台语言特性:

  • 编译模式: 是编译成可执行文件, 还是编译成中间代码, 还是解释器解释执行;
  • 运行模式: 直接由os加载运行, 还是虚拟机加载执行;
  • 内存挂你: 是否支持GC;
  • 并发支持: 是否原生支持并发, 还是库支持;
  • 交叉编译: 是否支持交叉编译;
  • 跨平台支持: 是否支持多个平台;

语言软实力特性:

  • 库: 标准库和第三方库是否丰富, 好用, 高效;
  • 框架: 是否有非常出众的框架;
  • 语言自身兼容性: 语言规范是否经常变换, 语言新版本向前兼容性;
  • 语言影响力: 是否有商业公司支持, 社区的活跃性, 是否是著名项目;

1.3 Go语言特性:

2. 初识 Go 程序:

hello .go

package main

import "fmt"

func main() 
	fmt.Printf("Hello, world, 你好,世界!\\n")

Go源代码特征解读:

  • 源程序以".go"为后缀;
  • 源程序默认为UTF-8编码;
  • 标识符区分大小写;
  • 语句结尾的分号可以省略;
  • 函数以func开头, 函数体开头必须在函数头所在的行尾部, 不能让单独一行;
  • 字符串字面量使用""(双引号)括起来;
  • 调用包里面的方法通过.访问符, 例如fmt.Printf
  • main函数所在的包名必须是main;

3. Go词法单元:

现代高级语言的源程序内部的几个概念:
token、关键字、标识符、操作符、分隔符和字面量;

3.1 token:

token是构成源程序的基本不可分割单元. 编译器编译源程序的第一步就是将源代码分割为一个个独立的token, 这个过程就是词法分析;
go语言的token可以分为: 关键字、标识符、操作符、分隔符和字面量;

token:

  • identifiers(标识符):
    • Predeclared identifiers(预声明标识符):
      • keywords(关键字)
      • 其他预声明标识符:
        • 内置数据类型标识符
        • 常量值标识符;
        • 空白标识符;
        • 内置函数;
    • 用户自定义标识符:
      • 包名;
      • 变量名;
      • 常量名;
      • 函数名;
      • 自定义类型名;
      • 方法名;
  • operators and delimitersI(操作符和分隔符):
    • 操作符:
      • 不但起到分隔token的作用, 本身也是一个token;
    • 纯分隔符: (仅仅起到分隔token作用, 本身不是token)
      • 空格;
      • 制表符
      • 回车
      • 换行
  • literals(字面常量):
    • 整数字面量;
    • 浮点型字面量;
    • 复数类型字面量;
    • 字符串字面量;
    • 字符型字面量;

go的token分隔符有两类:

  • 操作符;
  • 自身没有特殊含义, 仅用来分隔其他token, 被称为纯分隔符

3.2 标识符:

标识符: 用来标识变量, 类型, 常量等语法对象的符号名称, 其在语法分析时作为一个token存在;
总体分类:

  • 语言设计者预留的标识符;
  • 编程者可以自定义的标识符;

Go语言的预声明标识符:
关键字:
共35个关键字, 可分为3类:

  • 引导程序整体结构:
关键字说明
package定义包名
import导入包名
const常量声明
var变量声明
func函数定义
defer延迟执行
go并发语法糖
return函数返回
  • 声明符合数据结构:
关键字说明
struct定义结构体
interface定义接口
map声明或创建map类型
chan声明或创建通道类型
  • 控制结构:
关键字说明
if … else …if…else语句
for、range、break、continuefor循环
switch、select、type、case、default、fallthroughswitch和select语句
gotogoto跳转语句
  • 内置数据类型标识符:(20个)

    • 数值:
      • 整数:
        • byte、int、int8、int16、int32、int64
        • uint、uint8、uint16、uint32、uint64、uintprt
      • 浮点型:
        • float32、float64
      • 复数型:
        • complex64、complex128
    • 字符和字符串
      • string、rune
    • 接口:
      • error
    • 布尔:
      • bool
  • 内置函数:
    内置函数也是高级语言的 种语法糖, 全局可见性;

关键字说明
make()申请内存,创建实例
new()创建对象
len()长度
cap()容量
append()list追加
copy()从切片中复制数据
delete()删除
panic抛异常
recover()捕获异常(宕机恢复)
close()上下文关闭
complex()构建复数
real()复数实部
image()复数虚部
print()打印
println()打印并换行
  • 常量值:
关键字说明
true, falsebool常量
iota连续枚举值
nil指针/引用的默认值
  • 空白标识符:
关键字说明
-表示匿名变量, 通常用作左端占位符

3.3 操作符和分隔符:

算术运算符
位运算符
赋值和赋值复合运算操作
比较运算符
括号
逻辑运算符
自增自减
其他

3.4 字面常量

整型字面量
浮点型字面量
复数类型字面量
字符型字面量
字符串字面量

3.5 总结:

  • 关键字引导程序的基本结构;
  • 内置类型标识符辅助声明变量与常量;
  • 字面量辅助变量和常量的初始化;
  • 分隔符帮助Go编译器识别各个token;
  • 操作符和变量、关键字一起构成丰富的语法单元;

4. 变量与常量:

4.1 变量:

4.1.1 声明方式:

显式的完整声明:
var varName dataType [ = value ]
说明:

  • 关键字var用于变量声明;
  • varName是变量名标识符;
  • dataType是Go数据基本类型;
  • value是变量的初始值, 可以是字面量, 可以是其他变量名,也可以是表达式; 如果没有初始值, 则为默认值;
  • Gode 变量声明后会立即为其分配空间;

短的声明
varName := value

  • :=声明只能出现在函数(方法)内;
  • 此时Go编译器自动进行数据类型推断;

多个类型变量同时声明:
a, b := 1, "hello"

4.1.2 变量属性:

  • 变量名:
    • 遵循关键字规则;
  • 变量值:
    • 指向的是地址中存放的值;
  • 变量存储和声明周期:
    • Go提供自动内存管理;
    • 编译器使用栈逃逸技术自动分配空间;
  • 类型信息
  • 可见性与作用域;

4.2 常量:

常量使用一个名称来绑定一块内存地址, 该地址中存放的内容不可改变; 常量存储在程序的**只读段(.rodata section)**里;

预声明标识符iota用在常量声明里, 其初始值为0; 一组多个常量同时声明时其值逐行增加, iota可以看做自增枚举变量, 专门用来初始化常量;

// 类似枚举的iota
const (
	c0 = iota // c0 = 0
	c1 = iota // c0 = 1
	c2 = iota // c0 = 2
)

// 简写模式
const (
	c0 = iota  // c0 = 0
	c1		   // c0 = 1
	c2		   // c0 = 2
)

// 注意iota逐行增加
const (
	a = 1 << iota	// a = 1 (iota = 0)
	b = 1 << iota	// b = 1 (iota = 1)
	c = 3			// c = 3 (iota = 2, unused)
	d = 1 << iota	// d = 8 (iota = 3)
)

// 分开的const语句, iota每次从0开始
const x = iota	// x = 0
const y = iota	// y = 0

5. 基本数据类型:

Go是一种强类型的静态编译语言, 类型是高级语言的基础, 有了类型, 高级语言才能对不同类型抽象出不同的运算;

5.1 布尔类型:

5.2 整型:

内置12种整数类型, 其中byteuint8的别名; 不同类型的整型必须进行强制类型转换;

5.3 浮点型:

  • 浮点数字面量被自动推断为float64
  • 高精度科学计算用该使用math标准库;

5.4 复数类型:

var v = complex(2.1, 3)	// 构造一个复数
a := real(v)	// 返回复数实部
b := real(v)	// 返回复数虚部

以上是关于golang核心编程的主要内容,如果未能解决你的问题,请参考以下文章

golang类型字面量

词法结构

387集Go语言核心编程培训视频教材整理 | Golang变量

387集Go语言核心编程培训视频教材整理 | Golang变量

387集Go语言核心编程培训视频教材整理 | Golang变量

387集Go语言核心编程培训视频教材整理 | Golang的概述