Go 语言入门指南(1)|青训营

128 阅读4分钟

Go语言优势和特性

  • 高性能、高并发
  • 静态编译
  • 丰富的库和详细的开发文档
  • 语法简洁
  • 跨平台
  • 垃圾回收

基础语法

Hello World

  • fmt.Println("Hello World")

变量和常量声明

  • 4种声明的方式:
    • var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)
  • 每一个variable都有type
    • 直接声明 =
      • var variableName type = value
    • 简洁声明
      • := 直接取代 vartype
      • 但只能用在函数内部
      • vname1, vname2, vname3 := v1, v2, v3
  • _ 是个特殊的变量名,任何赋予它的值都会被丢弃
  • 常量声明:
    • const constantName = value

数值类型

  • 布尔值:bool,默认为false
  • 数值类型:
    • 整数:
      • intuint:长度相同,但具体长度取决于不同编译器的实现
      • runeint32的别称,byteuint8的别称
      • 不同长度类型的变量之间不允许互相赋值或操作,不然会在编译时引起编译器报错
      • 尽管int的长度是32 bit, 但int 与 int32并不可以互用
    • 浮点数:
      • float32float64(没有float),默认是float64
    • 复数:
      • 默认类型是complex128(64位实数+64位虚数),也有complex64(32位)
      • 复数的形式为RE + IMi

字符串

  • 基本于python中的字符串一致
  • 多行的字符串:
    • m := `hello world
  • 括起的字符串为Raw字符串,即字符串在代码中的形式就是打印时的形式,它没有字符转义,换行也将原样输出
  • 格式化 fmt.Printf("%v", s)
  • +v 变量名
  • #v 结构体

数组和字典

  • 数组 array
    • 定义
      • var a [5]int
      • b := [...]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)
      • len 
      • cap 获取slice的最大容量
      • append 
        • s = append(s, elem)
        • 会改变slice所引用的数组的内容,从而影响到引用同一数组的其它slice
      • copy 
        • cpoy(c1, c2)
  • 字典
    • make(map[string]int)
    • 基本与python一致

make & new

  • make用于内建类型(mapslice 和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是一个intslice
  • 指针传参
    • 与C语言中传参类似
    • func add1(a *int) int
    • x1 := 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.Args
    • os.Getenv("PATH)"

总结

在学习了基础语法之后,接下来会进一步深入学习Go语言的标准库、并发编程和其他高级特性,以充分发挥Go语言的优势。总体来说,Go语言是一门现代化的编程语言,值得开发者深入学习和应用。

Reference

  1. 走进 Go 语言基础语法
  2. Go基础语法宝典