Go Lang Study Notes 1

Views: 926
Wrote on Jan. 3, 2021, 2:10 a.m.

变量和常量

变量

变量的定义

var a int
var b bool 
var c int8

var (
    m int
    n string
)

var name string = "nazha"

func main(){
    age := 18//声明变量age同时初始化;编译器会根据右边的初始值推断出age是什么类型
}

常量

const PI = 3.1415926

const KB = 1024

iota

Go中借助iota来实现枚举

const (
        n1 = iota //0
        n2        //1
        n3        //2
        n4        //3
    )
  • iota在const关键字出现时将被重置为0
  • const中每新增一行常量声明将使iota累加一次
  • const声明的常量后面没有内容默认就跟上一行一致

    基本数据类型

String

使用双引号表示字符串 "hello"

使用单引号表示字符 'h'

字符串的常用方法

整型

int int8 int16 int32 int64

uint uint8 uint16 uint32 uint64

int是特殊的,会根据你的操作系统的位数来决定是int32还是int64

浮点型

float32 flot64

浮点数永远都是不精确.(为什么计算机表示的浮点数不精确)

  • 转换成字符串去做运算

  • 整体放大多少倍转换成整数进行运算

复数

complex64和complex128

布尔

var a bool//默认是false
var b = true

Go语言中布尔类型不能和其他类型做类型转换

byte和rune

英文字符用byte(ASCII码能表示的) 01010101

rune(中文,UTF8编码) 01010101 01010101 01010101

什么时候用rune?

s := "hello中国"
for i:=0;i<len(s);i++{
    fmt.Println(s[i]) //默认按照ASCII码打印
    fmt.Printf("%c\n", s[i])
}
fmt.Println()
for index, char:=range s{
    fmt.Printf(index, char)
    fmt.Printf("%c\n", char)
}

流程控制

if

age := 20
if age>18{

}else if 20 > 18 {

}else{

}

//此时age只在if语句中有效
if age:=20;age>18{

}

for

//标准for循环
for i:=0;i<10;i++{

}

//类似while循环
n := 10
for n>0 {
    fmt.Println(n)
    n--
}

//无限循环
for {

}

switch和case

n := 10
switch n{
    case 1:
    ...
case 2:
    ...
}

switch {
    case n>0:
    ...
    case n ==0:
    ...
}

为了兼容之前的C代码 fallthrough

以下是了解为主

goto+label

continue+label

break +label

运算符

https://www.liwenzhou.com/posts/Go/03_operators/

课后练习

把字符串的IP地址"192.168.19.200"转换成整数

格式化打印的参数

fmt.Println()
fmt.Printf("%s")

数组

数组是同一种数据类型元素的集合。

声明定义

初始化

二维数组

数组的遍历

数组是值类型

午后小分享

当你觉着不行的时候,你就去人行道上走一走,这个时候你就是一个行人。

切片

切片三要素:

  • 地址(切片中第一个元素指向的内存空间)
  • 大小(切片中目前元素的个数) len()
  • 容量(底层数组最大能存放的元素的个数) cap()

切片支持自动扩容,扩容策略3种

  • 每次只追加一个元素,每一次都是上一次的2倍

  • 追加的超过原来容量的1倍,就等于原来的容量+扩容元素个数的最接近的偶数

  • 如果切片的容量大于了1024,后续就每次扩容0.25倍 ?

给切片追加元素

append()函数是往切片中追加元素的。

a = append(a, 1)

得到切片的三种方式:

  • 直接声明a := []int{1,2,3} len:3 cap:3
  • 基于数组得到切片 m := [5]int b:= m[:3] len:3, cap:5
  • 基于切片得到切片 b := a[:2] len:2 cap:3

使用make初始化切片

make用于给引用类型申请内存空间

切片必须初始化,或者用append才能使用

var s []int
s = make([]int, 大小, 容量)

对切片初始化时,容量尽量大一点,减少程序运行期间再去动态扩容。

map

map定义

映射, key-value结构

var n map[string]int

map初始化

make(map[string]int, [容量])

map的遍历

for ... range 循环

函数

可变参数

func add4(a int, b ...int) int {

}

可变参数只能有一个并且只能放在参数的最后!!!

Go语言中没有默认参数!!!

多返回值

func add5() (int, int, int) {
    return 1, 2, 3
}

闭包的定义:

闭包 = 函数 + 它引用的外层作用域的变量