go 基础知识

背景

语言应用领域:

嵌入式、汇编:C语言

操作系统:C语言

系统级服务编程:C++

企业级应用和WEB应用:Java

 

GO致力于解决 并发支持不友好、编译速度慢、编程复杂 三个问题

 

标识符和关键字

变量和常量

运算符

表达式

简单语句

控制结构

 

函数

接口

 

编译模式: 编译成可执行程序

运行模式:直接运行

内存管理:支持自动垃圾回收

并发支持:协程(语言原生支持)

交叉编译:支持

跨平台支持:支持

 

库:丰富

框架:丰富

 

Go源码特征

源程序以 .go 为后缀

源程序默认为 UTF-8 编码

标识符区分大小写

语句结尾的分号可以省略

函数以func开头,函数体开头的 { 必须在函数头所在行尾部,不能单独起一行

字符串字面量使用" "括起来

调用包里面的方法通过点 . 访问符,比如示例中的fmt.Printf

main函数所在的包名必须是main

 

token(词法分析---->词法单元):

关键字、标识符、操作符、分隔符、字面常量

标识符:开头一个字符必须是字母或下划线,后面跟任意多个字符、数字或下划线,并区分大小写

关键字:go具有25个关键字。package(定义包名)、import(导入包名)、const(声明常量)、var(声明变量)、func(定义函数)、defer(延迟执行)、go(并发语法糖)、return(函数返回)、struct(定义结构体)、interface(定义接口)、map(声明map)、chan(声明通道)、

if 、else(顺序语句)、 for、range、break、continue(循环语句)、switch、select、type、case、default、fallthrough(switch语句)、goto(goto跳转)

预声明标识符:65个预声明标识符,包括25个关键字、20个数据类型标识符、4个常量值标识、1个空白标识、15个内置函数

整形(byte、int、int8、int16、int32、int64、uint、unint8、uint16、uint32、uint64、uintptr)

浮点型(float32、float64)

复数型(complex64、complex128)

字符和字符串型(string、rune)

常量值标识(true、false、iota(枚举声明中)、nil(指针变量默认值))

空白标识符( _ )

操作符和分隔符:操作符47个、分隔符4个(空格、制表、回车、换行)

算术运算符(+  -  *  /  %)

位运算符(&   |   ^    &^   >>    <<)

赋值运算符(:=  =   +=   -=   *=    /=     %=   &=   |=   ^=   &^=   >>=   <<=)

比较运算符(>   >=   <   <=   ==   !=)

括号( ( )  { }    [ ])

逻辑运算符(&&   ||   !)

自增自减(++   --)

其它运算符(: , ;  .    ...    <-)

字面常量:表示固定值的符号叫做字面常量

 

变量声明:

var  varName  dataType  [ = value]

e.g:   var a int = 1

短声明 (只能出现在函数内,go编译器自动进行数据类型推断)

var  := value

 

常量声明:

const{

  c0 = iota   // c0 =1

  c1 = iota    // c0 =2

  c2 = iota   // c0 =3

}

iota用在常量声明中,其初始值为0,iota可看作自增的枚举变量(在同一代码块中依次增加),专门用来初始化常量

 

复合数据类型:

指针、数组、切片、字典(map)、通道、结构、接口

指针:指针声明类型*T,变量名前加&获取变量地址,*T获取内容

数组:[n]elementType  

var name [2]int  // 元素默认值为0

a := [3]int{1,2,3}

a := [...]int{1,2,3}  // 不指定长度,通过初始化列表确定长度

a := [3]int{1:1, 2:3}

切片:变长数组,引用类型

array[b:e] 表示在数组中创建一个包含e-b个元素的切片,第一个是array[b] 最后一个array[e-1]

字典:map

ma := map[string] int{"a":1, "b":2}

struct:结构体,由多个不同类型的元素组合而成

type TypeName struct {

        FieldName  FieldType

        FieldName  FieldType

        FieldName  FieldType

}

 

控制结构:

if x<= y {

      return y

} else {

      return x

}

 

switch {

case 条件1:

      。。。

case 条件2:

      。。。

case 条件3:

      。。。

}

fallthough 强制执行下一个case字句

 

for init; condition; post{ }

for key, value := range map{ }    // 通过range可以对数组、切片、字符串、map、通道进行访问

 

标签和跳转:(只能跳到同级 或者 上层作用域)

Lable:  Statement

goto Lable

 

函数:支持多值返回、支持闭包、支持可变参数、不支持函数重载、不支持函数嵌套

多个相邻的相同类型参数可以使用简写模式

func swap(a, b int) (int, int){

  return b, a

}

函数的参数传递,采用值传递

不定参数:使用  paramName ... type

func  sum(arr  ...int)(sum int){

    for  _, v := range arr{

             sum += v

    }

    return

}

函数延迟执行  采用defer (defer后面必须是函数或方法,调用采用先进后出的顺序在函数返回前进行执行,类似java的finally,确保资源最终能够回收或释放)

 

内置函数:

panic()  抛出错误

recover()  捕获 panic抛出的错误

 

go中的error: compile error、runtime error、logic error

 

go是强类型语言,编译器在编译时会进行严格的类型校验

类型强制转换:语法格式 var a T = ( T ) ( b )   // 使用括号将类型和要转换的变量或表达式的值括起来

 

接口:interface

接口的命名一般以“er”结尾

接口定义的内部方法声明不需要func引导

在接口定义中,只有方法声明没有方法实现

posted @ 2022-07-22 10:55  wangssd  阅读(102)  评论(0编辑  收藏  举报