Go语言基础| 青训营笔记

88 阅读2分钟

Go 语言基础

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

变量声明
// 声明变量一般形式为使用关键字 var
var identifier type;
//多个变量
var identifier1, identifier2 type;
// 1,指定变量类型
var a int  // 没有初始化,变量默认为 0 ;
var b bool // bool 没有初始化,变量默认为 false;
var c float32 = 3,2 //声明变量并初始化,为显示构造

// 2,根据值自行判断变量类型
var c = "hello";//声明一个变量并初始化

//3,使用 := 声明变量
d := "world"
// d := "world" 相当于
var d string
d = "world"
/*
	var a int
	a := 1 
	编译错误, a已经声明,不需要重新声明
*/

//多变量声明 
//类型相同多个变量, 非全局变量
var a, b, c float32
a, b, c = v1, v2, v3

var a, b, c = v1, v2, v3 // 不需要显示声明类型,自动推断,并初始化

a, b, c := v1, v2, v3 // 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误

//空白标识符 _
_, a = 6, 7//6的值会被抛弃
常量
//显式类型定义
const a int = 1
//隐式类型定义
const b = 1 // 自己判断类型
条件语句
//if — else
var a = 10;

if a < 20 {
    fmt.Printf("a 小于 20 大于15\n" )
}else if a < 15 {
    fmt.Printf("a 小于 15\n" )
}else {
    fmt.Printf("a 大于 20\n" )
}


//switch
a := 10
switch {
   case a > 0 : {
      fmt.Println("a > 0")
   }
   case a >5 : {
      fmt.Println("a > 5")
   }
   default : {
      fmt.Println("default")
   }
}
//switch 支持多条件匹配
switch{
    case 1,2,3,4:
    default:
}

if 后应当紧跟一个括号,此括号可加可不加,if 表达式后面的大括号是必要的,不可省略。

循环语句
//1 类似for 循环
sum := 0
      for i := 0; i <= 10; i++ {
         sum += i
      }

//2类似while语句
 sum := 1
   for ; sum <= 10; {
      sum += sum
   }

//3,无限循环
for {
      sum++ // 无限循环下去
   }
   
   //Go 中的 break 与 continue 作用相同
数组
//声明数组
var nums [10] int
//数组初始化
var nums = [5]int{1,2,3,4,5}
nums := [5]int{1,2,3,4,5}
//通过[]来访问数组元素
nums[0] ...
切片
//make() 函数来创建切片
var s []string = make ([]string, 10)//10为切片长度
s := make ([]string, 10)//与上面同理
make([]T, length, capacity)//capacity 为切片的容量

s := arr[startIndex:endIndex]//将 arr 中从下标 startIndex 到 endIndex-1 下的元素创建为一个新的切片。
//默认 endIndex 时将表示一直到arr的最后一个元素。
s := arr[startIndex:] 
//默认 startIndex 时将表示从 arr 的第一个元素开始。
s := arr[:endIndex] 

numbers := []int{0,1,2,3,4,5,6,7,8} 
fmt.Println("numbers[1:4] ==", numbers[1:4])//numbers[1:4] == [1 2 3]
//切片是可索引的,并且可以由 len() 方法获取长度。
//切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。

var numbers = make([]int,4,6)//表示长度为4,容量为6

fmt.Printf("len=%d cap=%d slice=%v\n",len(numbers),cap(numbers),numbers)//len=4 cap=6 slice=[0 0 0 0]

//copy将内容进行拷贝
//append添加一个元素

var numbers = make([]int,4,6)
numbers = append(numbers, 1)//向切片添加一个元素 
fmt.Printf("len=%d cap=%d slice=%v\n",len(numbers),cap(numbers),numbers)//len=5 cap=6 slice=[0 0 0 0 1]

var numbers1 []int
copy(numbers1,numbers)//拷贝 numbers 的内容到 numbers1 
fmt.Printf("len=%d cap=%d slice=%v\n",len(numbers),cap(numbers),numbers)//len=5 cap=6 slice=[0 0 0 0 1]
范围
//关键字为 range, 可进行范围遍历
nums := [9]int{0,1,2,3,4,5,6,7,8} 
for i, v := range nums {
    fmt.Printf("%d %d\n", i, v)//i为idx ,v为值
    
}
指针
var a int = 100
var b int= 200
swap(&a, &b);
fmt.Printf("交换后 a 的值 : %d\n", a )//进行了值的交换
fmt.Printf("交换后 b 的值 : %d\n", b )
swap1(a, b);
fmt.Printf("交换后 a 的值 : %d\n", a )//值没有进行交换
fmt.Printf("交换后 b 的值 : %d\n", b )

func swap(x *int, y *int){
    *x, *y = *y, *x
}

func swap1(x int, y int){
    x, y = y, x
}
//函数传参均为值传递,而不是引用引用传递
函数
//函数的定义

func function_name( [parameter list] ) [return_types] {
   函数体
}

func max(a, b int) int {
     var result int

   if (num1 > num2) {
      result = num1
   } else {
      result = num2
   }
   return result
}

//go可返回多个值
func swap(x, y int) (int, int){
    x := 1
    y := 2
    return x, y;
}
结构体
//定义一个结构体

type struct_variable_type struct {
   member definition
   member definition
   ...
   member definition
}



//声明一个结构体:

type user struct {
    name     string
    password string
}

//初始化一个结构体:

a := user{name: "wang", password: "1024"}
fmt.Printf("%+v\n", a) // {name:wang password:1024}

//未对一个结构体进行初始化,则结构体成员将采用默认值:

var b user
fmt.Printf("%+v\n", b) // {name: password:}

//如果要访问结构体成员,需要使用点号 . 操作符

fmt.Println(a.name) // wang
fmt.Println(a.password) // 1024

结构体方法

//检测密码是否匹配

func (u user) checkPassword(password string) bool {
    return u.password == password
}

//可以修改密码的方法

func (u *user) resetPassword(password string) {
    u.password = password
}
//此处为指针,进行修改
map
/* 声明变量,默认 map 是 nil */

var map_variable map[key_data_type]value_data_type

/* 使用 make 函数 */

map_variable := make(map[key_data_type]value_data_type)

var mp map[string]string
mp = make(map[string]string)

//可以通过range来遍历

 for k, v := mp {
         fmt.Printf("%s -> %s\n", k, v)
    }
错误处理
//常用
if err != nil {
   fmt.Println(err)
}