【Go语言基础】纯个人学习基础点记录

目录

一、前言

二、学习与记录

1、Go简易教程:http://go-tour-zh.appspot.com/


一、前言

不同人对不同知识的学习掌握程度是不一样的,各自的知识盲点也是不同的。这篇文章主要用于个人记录Go语言知识学习过程中的盲点。如果能帮到你,记得点个赞哦;如果有不足or错误,请留言评论哦。谢谢大家~

二、学习与记录

1、(20200407)Go简易教程:http://go-tour-zh.appspot.com/

基本类型:
byte // uint8 的别名
rune // int32 的别名,代表一个Unicode码


nil类型:
非基础类型(数组、切片、map、struct)的、指针类型的零值。


结构体指针类型:
结构体字段可通过结构体指针来访问or直接用结构体访问。


类型转换:
表达式 T(v) 将值 v 转换为类型 `T`。Go不同类型之间需要手动显式转换,不能隐式转换。


常量:
const PREFIX string = "HAPPY_"  // const不能用:=
一个未指定类型的常量由上下文来决定其类型。


其他语法:
循环:只有for,三段语句分别都可以为空(死循环),只有中间的条件时和其他语言的while相同。与:=range联用可对数组or切片or map迭代循环。
条件:可以用无条件的switch语句代替多条件的if else语句。
defer语句:在return前执行,采用栈的形式,先defer后执行。


数组:
[6]int,数组定义长度后不能改变(指定长度)。
[]int、array[1:3],切片为数组的引用,长度可变(未指定长度,可以用append)。
a := []int{1, 2, 3, 4, 5, 6}
cap()容量,cap(a)为6,cap(a[1:3])为5从起点1到所有。
len()长度,len(a)为6,len(a[1:3])为2从起点1到3。


map:
使用之前必须用make而不是new来创建。
删除:delete(m, key)
检查存在:elem, ok = m[key]


函数值(把函数当做值)做参数:
用途1、回调:回调函数(A,一般多个不同功能、不同函数名、相同参数返回值的函数)+中间函数(A作为B函数的参数,B)+起始函数(调用B的函数)。
用途2、闭包:保留每次调用的中间值。


方法:
Go没有类,但有struct,可在struct上面定义方法。
该方法可以与命名类型or命名类型的指针关联。
使用指针接收者(func (v *Vertex) Abs() float64 {...})情况:
1、首先,避免在每个方法调用中拷贝值(如果值类型是大的结构体的话会更有效率);
2、其次,方法可以修改接收者指向的值(非指针的只是值拷贝不改变值)。


接口:
Go的接口都是隐式的,即只需要声明一个type name interface{ func },然后在不同的struct中实现同名接口就ok了,不需要implemts接口名。隐式接口解藕了实现接口的包和定义接口的包:互不依赖。

一个普遍存在的内建接口是 fmt 包中定义的 Stringer,Stringer 是一个可以用字符串描述自己的类型。`fmt`包 (还有许多其他包)使用这个来进行输出。
type Stringer interface {
    String() string
}
另一个普遍存储的借口,`builtin`包里面的error类型是一个内建接口:
type error interface {
    Error() string
}

io 包指定了 io.Reader 接口, 它表示从数据流结尾读取。Go 标准库包含了这个接口的许多实现, 包括文件、网络连接、压缩、加密等等。io.Reader 接口有一个 Read 方法:func (T) Read(b []byte) (n int, err error) Read 用数据填充指定的字节 slice,并且返回填充的字节数和错误信息。 在遇到数据流结尾时,返回 io.EOF 错误。

Web 服务器:包 http 通过任何实现了 http.Handler 的值来响应 HTTP 请求。
package http
type Handler interface {
    ServeHTTP(w ResponseWriter, r *Request)
}


Goroutine:
是由 Go 运行时环境管理的轻量级线程。goroutine 在相同的地址空间中运行,因此访问共享内存必须进行同步。sync 提供了这种可能,不过在 Go 中并不经常用到,因为可以用channel的办法。


Channel:
1、channel是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值(“箭头”就是数据流的方向。)和 map 与 slice 一样,channel 使用前必须创建:ch := make(chan int)。默认情况下,在另一端准备好之前,发送和接收都会阻塞。这使得 goroutine 可以在没有明确的锁或竞态变量的情况下进行同步。
2、channel可以是带缓冲的。为 make 提供第二个参数作为缓冲长度来初始化一个缓冲 channel:ch := make(chan int, 100)。向缓冲 channel 发送数据的时候,只有在缓冲区满的时候才会阻塞。当缓冲区清空的时候接受阻塞。
3、channel的操作可通过range和close进行。发送者可以 close 一个 channel 来表示再没有值会被发送了。接收者可以通过v, ok := <-ch来测试 channel 是否被关闭。循环 `for i := range c` 会不断从 channel 接收值,直到它被关闭。
注意:1)只有发送者才能关闭 channel。向一个已经关闭的 channel 发送数据会引起 panic。 2)channel 与文件不同,通常情况下无需关闭。只有在需要告诉接收者没有更多数据的时候才有必要进行关闭,例如中断一个 `range`。
4、select 语句使得一个 goroutine 在多个通讯操作上等待。select 会阻塞,直到case分支中的某个可以继续执行 or 执行default分支,常常与for联用。当多个都准备好的时候,会随机选择一个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值