Go语言优势和特性
- 高性能、高并发
- 静态编译
- 丰富的库和详细的开发文档
- 语法简洁
- 跨平台
- 垃圾回收
基础语法
Hello World
fmt.Println("Hello World")
变量和常量声明
- 4种声明的方式:
- var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)
- 每一个variable都有type
- 直接声明 =
var variableName type = value
- 简洁声明
:=直接取代var和type- 但只能用在函数内部
vname1, vname2, vname3 := v1, v2, v3
- 直接声明 =
_是个特殊的变量名,任何赋予它的值都会被丢弃- 常量声明:
const constantName = value
数值类型
- 布尔值:
bool,默认为false - 数值类型:
- 整数:
int和uint:长度相同,但具体长度取决于不同编译器的实现rune是int32的别称,byte是uint8的别称- 不同长度类型的变量之间不允许互相赋值或操作,不然会在编译时引起编译器报错
- 尽管int的长度是32 bit, 但int 与 int32并不可以互用
- 浮点数:
float32和float64(没有float),默认是float64
- 复数:
- 默认类型是
complex128(64位实数+64位虚数),也有complex64(32位) - 复数的形式为
RE + IMi
- 默认类型是
- 整数:
字符串
- 基本于python中的字符串一致
- 多行的字符串:
m := `hello world
- 括起的字符串为
Raw字符串,即字符串在代码中的形式就是打印时的形式,它没有字符转义,换行也将原样输出 - 格式化
fmt.Printf("%v", s) +v变量名#v结构体
数组和字典
- 数组 array
- 定义
var a [5]intb := [...]int{4, 5, 6}- 二维数组:
easyArray := [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}}
- 数组不能改变长度:因为长度也是数组类型的一部分(
[3]int与[4]int是不同的类型) - 数组之间的赋值是值的赋值,即当把一个数组作为参数传入函数的时候,传入的其实是该数组的副本,而不是它的指针
- 定义
- 动态数组 slice
- 一个引用类型, 总是指向一个底层
array slice的声明也可以像array一样,只是不需要长度slice := []byte {'a', 'b', 'c', 'd'}
- 有几个有用的内置函数
make([]string, 3)lencap获取slice的最大容量appends = append(s, elem)- 会改变
slice所引用的数组的内容,从而影响到引用同一数组的其它slice
copycpoy(c1, c2)
- 一个引用类型, 总是指向一个底层
- 字典
make(map[string]int)- 基本与python一致
make & new
make用于内建类型(map、slice和channel)的内存分配- 返回初始化后的(非零)值
- 只能创建这三个内置类型,并且返回一个有初始值(非零)的
T类型,而不是*T。本质来讲,导致这三个类型有所不同的原因是指向数据结构的引用在使用前必须被初始化
new用于各种类型的内存分配- 返回指针
new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值
逻辑处理
- for
for expression1; expression2; expression3 { }- 可以当成while使用
range nums
- switch
- case中无需break
- 可以使用
fallthrough强制执行后面的case代码
函数
func funcName(input1 type1, input2 type2) (output1 type1, output2 type2)- 传一个参数值到被调用函数里面时,实际上是传了这个值的一份copy
- 变参
func myfunc(arg ...int) {}arg是一个int的slice
- 指针传参
- 与C语言中传参类似
func add1(a *int) intx1 := add1(&x)
- 函数也是一种变量,可以通过
type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型- 可以把这个类型的函数当做值来传递
结构体 struct
type user struct {name string}user{name:""}- 可定义方法
func (u user) check()
- 匿名字段,也称为嵌入字段
- 只提供类型,而不写字段名
- 当匿名字段是一个
struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct - 能够实现字段的继承,相当于套娃一样,一个struct里面套另一个struct作为属性
- method
func (r ReceiverType) funcName(parameters) (results)
数据处理
- JSON处理
buf, err = json.Marshal()
- 时间处理
- import time包
time.Now()time.Unix()时间戳
- 数字解析
strconv包strconv.ParseFloat
- 进程信息
os.Argsos.Getenv("PATH)"
总结
在学习了基础语法之后,接下来会进一步深入学习Go语言的标准库、并发编程和其他高级特性,以充分发挥Go语言的优势。总体来说,Go语言是一门现代化的编程语言,值得开发者深入学习和应用。