Go 语言入门| 青训营

103 阅读5分钟

记录了go语言基础部分做为后续学习的查询笔记。

变量和常量的定义和使用

  • 在 Go 中, 声明一个变量但不使用它时,Go会抛出错误
  • 变量被声明后系统会自动赋值初始化,int 为 0,float 为 0.0,bool 为 false,string 为空字符串,指针为 nil
  • 变量名使用驼峰命名法,需要被外部包使用的变量名应该将首个单词字母大写

变量的声明和初始化

go语言为类型后置,定义时依次表示 关键字 变量名 类型名,变量声明关键字 var


var s1 string 

var (
    s1,s2 string
    s3 int
)

可以对值直接进行初始化赋值,赋值时可以指定类型,不指定go会进行自动推导

var (
	s1,s2,s3 = "a","b","c"
)

此外还可以使用 := 的方式实现声明和初始化

 name := "coco"

常量的声明

go中的常量声明关键字为 const ,同样可以实现自动推导 iota 可以实现枚举,iota的其他看到了再补充

const Status = 15 

const ( 
    a = iota 
    b = iota 
    c = iota
) //a=0 b=1 c=2
与下方等价
const ( 
    a = iota 
    b 
    c 
) //a=0 b=1 c=2

基本类型

类型别名

可以使用type关键字为某个类型起名

type hello int

布尔类型 bool true/false

运算符

  • ! 非 ,&& 和,或||,== 相等, != 不等
优先级     运算符
 7      ^ !
 6      * / % << >> & &^
 5      + - | ^
 4      == != < <= >= >
 3      <-
 2      &&
 1      ||

数字类型

  • int 强制类型转换需要显示的进行 类似于 x := int32(6),此时x为int32型,类型转换至会导致数字切除 strconv 提供类型转换函数
整数:
int8-128 -> 127int16-32768 -> 32767int32-2,147,483,648 -> 2,147,483,647int64-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,807)


无符号整数:
uint80 -> 255uint160 -> 65,535uint320 -> 4,294,967,295uint640 -> 18,446,744,073,709,551,615
  • float
浮点型:
float32(+- 1e-45 -> +- 3.4 * 1e38float64(+- 5 1e-324 -> 107 1e308
  • 数字相关格式化说明符
    • %d 格式化整数输出
    • %g 格式化浮点型输出
    • %f 输出浮点数
    • %e 输出自然计数法
    • %0d 用于规定输出长度
    • %6.2e 表示3.4的输出结果为 3.40e+00
    • %6f 表示3.4的输出结果为 3.40000
    • %6.2f 表示3.4的输出结果为 3.40
  • 复数
complex64 (32 位实数和虚数)
complex128 (64 位实数和虚数)

var c complex64 = 5 + 6i

c = complex (re,im)
可以从real(c),imag(c)获取实部和虚部

字符串类型

字符串类型 使用 "" 双引号引用 有以下转义字符


\n  换行符
\r  回车符
\t  制表符
\u  
\\   反斜杠
\'  单引号
\"  双引号

函数的声明

一个函数的声明由一个函数名字、参数列表(由函数的调用者提供参数变量的具体值)、一个可选的返回值列表和包含函数定义的函数体组成。 固定结构 func 函数名(参数列表) 返回值列表 {函数体}

func main(){
 ...
}

func PopCount(x uint64) int {
    return 50
}

也可以为返回值命名
func PopCount(x int32) (result int) {
    result = x + 50
    return 
}

返回多个值
func calc(number1 string, number2 string) (sum int, mul int) { 
    int1, _ := strconv.Atoi(number1) 
    int2, _ := strconv.Atoi(number2) 
    sum = int1 + int2 
    mul = int1 * int2 
    return
}

sum, mul := calc("15","20")
_ 用于丢弃不要的值

更改函数参数值

更改函数参数值需要使用指针,由于Go按值传递,直接修改值不会对原变量产生影响

func main() {
    Name := "avc"
    updateName(&Name)
    fmt.Println(Name)
}

func updateName(name *string) {
    *name = "des"
}

控制流

if/esle

if 7%2 == 0 {  
    fmt.Println("7 is even")  
} else {  
    fmt.Println("7 is odd")  
}


if num%2 == 0 {  
    fmt.Println("2")  
} else if num%3 == 0 {  
    fmt.Println("3")  
}else {
    fmt.Println("1")  
}

switch

switch 对变量做判断 go允许在case条件中对变量进行判断,且每个case结束自动break,除非使用 fallthrough

case 条件允许用逗号隔开多个 switch 条件运行包含函数,也可以省略条件,在case中判断

switch i {
case 0:
    fmt.Print("0")
case 1:
    fmt.Print("1")
case 2:
    fmt.Print("2")
default:
    fmt.Print("no match")
}

case "a","b","c","d" :
    fmt.Print("yes")
    
    
switch {
    case r>2:
        fmt.Printf(">2")
    default:
        fmt.Printf("<2")
}

循环 for

  • for 不带条件时等价与 while(0)
  • for 条件不带括号,条件中间由;隔开

defer

  • 推迟函数,直到包含defer的语句完成时调用
  • 多个defer语句按照定义顺序逆序执行

panic

内置 panic()函数可以停止 Go 程序中的正常控制流。 当你使用 panic 调用时,任何延迟的函数调用都将正常运行。

recover

可以使得程序崩溃后继续运行

数组

数组的定义

var arr [len]int

数组的遍历和赋值

var arr [5]int

for i:=0;i<5;i++ {
    arr[i] = i
    }

for index,_ :=range arr{
    arr[index[ = index
    }
    初始化
var arr = [5]int{1,2,3,4,5}
var arr = [5]int {1,2,3}  其余自动为0
var arr = [5]int {3:"a",4:"s"}

切片slice

  • 长度可变的数组,其优点在于是一个引用,不需要额外的内存,不能用指针指向切片
  • len() 当前长度
  • cap() 最大容量 声明格式
var arr2 []int
初始化
var arr2 []int = arr1[3:2]
arr2 := []int{1,2,3}

切片结构体包含三个部分
指向数组的指针,当前切片长度,切片容量

用make创建切片

var slice1 []type = make([]type, len)
s := make([]string, 3)
还可以指定cap
s := make([]string, 35)

make和new的区别

  • new (T) 为每个新的类型 T 分配一片内存,初始化为 0 并且返回类型为 * T 的内存地址:这种方法 返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构体;它相当于 &T{}。
  • make(T) 返回一个类型为 T 的初始值,它只适用于 3 种内建的引用类型:切片、map 和 channel。

Map

类似字典,可以使用range遍历

var map1 map[string]int
//测试值是否存在,存在返回true
_, ok := map1[key1]

其它

os.Args 变量包含传递给程序的每个命令行参数