Go 基础笔记 | 青训营

105 阅读4分钟

Go 基础笔记 | 青训营

这是我参与「第六届青训营 -后端场」笔记创作活动的的第1篇笔记

Go语言结构

函数起名字

当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected ),这里我就直接类比的java的private和public来理解
注意
需要注意的是 { 不能单独放在一行,所以以下代码在运行时会产生错误:
这里和java中的语法有些差别

Go语言基础语法

变量声明

第一种,指定变量类型,如果没有初始化,则变量默认为零值

第二种,根据值自行判定变量类型。


第三种,如果变量已经使用 var 声明过了,再使用 := 声明变量,就产生编译错误

以上三种方法中比较常用的的a:=value的方式,这种方式类似与这个kotlin中的变量,赋值之后自动识别类型

变量赋值

这里的赋值方式和c语言中非常像,如果不给方法的的参数传入地址,那么只是拷贝,传入的变量值在执行完方法之后不改变,如果有需要传入的值方法执行之后发生改变则需要传入地址加上&

空白标识符

空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。

_ 实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。


go的特殊之一,变量未被使用或者导入的包没有被使用会报错,通常使用空白标识符来解决这个问题 

条件if语句

if true/false{  
   }  

switch 语句的语法

switch var1 {  
    case val1:  
        ...  
    case val2:  
        ...  
    default:  
        ...  
    }  

这里不要break!!!

select语句

package main  
  
    import (  
        "fmt"  
        "time"  
    )  
      
    func main() {  
      
        c1 := make(chan string)  
        c2 := make(chan string)  
      
        go func() {  
            time.Sleep(1 * time.Second)  
            c1 <- "one"  
        }()  
        go func() {  
            time.Sleep(2 * time.Second)  
            c2 <- "two"  
        }()  
      
        for i := 0; i < 2; i++ {  
            select {  
            case msg1 := <-c1:  
                fmt.Println("received", msg1)  
            case msg2 := <-c2:  
                fmt.Println("received", msg2)  
            }  
        }  
    } 

Go数组

声明数组

var arrayName [size]dataType  

go中数组的数据类型的声明方式和java中不同,[]是在类型前面

初始化数组

var numbers = [5]int{1, 2, 3, 4, 5}  

如果数组长度不确定,可以使用 ... 代替数组的长度,编译器会根据元素个数自行推断数组的长度
如果设置了数组的长度,我们还可以通过指定下标来初始化元素: ``` balance := [5]float32{1:2.0,3:7.0} ``` ### Go指针 go的指针和c中差不多,注意:go中的空值为nil ### GO结构体 ```

type Books struct {
title string
author string
subject string
book_id int
}

func main() {

    // 创建一个新的结构体
fmt.Println(Books{"Go 语言", "www.runoob.com", "Go 语言教程", 6495407})

    // 也可以使用 key => value 格式
fmt.Println(Books{title: "Go 语言", author: "www.runoob.com", subject: "Go 语言教程", book_id: 6495407})

    // 忽略的字段为 0 或 空
fmt.Println(Books{title: "Go 语言", author: "www.runoob.com"})
}

这里的结构体和c中的语法类似,但是可以和java中的实体类比学习  
### 切片  

make([]T, length, cap)

go中切片make不是python中切片,这里类似一种动态数组,length是现在里面实际的元素数量,cap是最大容量,切片初始化之后默认cap=len=数组长度  
### range  
一般用法为  

for _,value:=range map{
}

这里的_可以换成变量,一般不会使用  
### map  
/* 使用 make 函数 */  
map_variable := make(map[KeyType]ValueType, initialCapacity)  
这里定义map的方式是比较新的,之前没见过  
### 接口类型转换  
value.(type)  
go的万能类型interface{} 类似于java中的Object  
### 语言接口  
func (struct_name_variable struct_name) method_name1() [return_type] {  
   /* 方法实现 */  
}  
<br>  
类似于javabean类的方法  
### 并发  
#### 协程  
使用go 函数名(参数)来开启一个协程  
  
goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。  
#### 通道  
通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道  


ch <- v    // 把 v 发送到通道 ch
v := <-ch  // 从 ch 接收数据
// 并把值赋给 v

通道的声明  
ch := make(chan int)  
<br>  
注意参数列表中要使用chan 关键字  
<br>
select 语句会监听所有指定的通道上的操作,一旦其中一个通道准备好就会执行相应的代码块。  
如果多个通道都准备好,那么 select 语句会随机选择一个通道执行。如果所有通道都没有准备好,那么执行 default 块中的代码。  
这里的条件判断中都不要加()  

学习建议

关于这个go的基础语法只是,同学们除了看视频之外还可以通过看菜鸟教程和codebaoku网站去学习,菜鸟比较基础,可以在看完菜鸟教程之后去看codebaoku,codebaoku的比较接近实战

注解:以上是在学习菜鸟教程时候的笔记附加上了个人对每个点的个人思考