go 介绍
1、是Google开源的
2、是编译型语言
3、21世纪的c语言
交叉编译:在windows 平台编译出Linux的可执行文件
go 基础语法
变量声明
var name string
name = "wang"
#类型推导
var name1 = "shan"
#简短变量声明
name2 := "sheng"
常量
const a=iota //0 ,当const 出现,iota 置为0,const 中每新增一个常量将使得iota 计数一次。iota是go 语言的常量计数器
const(
a1=iota
a2
a3
)
常见的基本数据类型:整形、浮点型、布尔型、字符串
复杂数据类型(符合数据类型):数组,数组是值类型
var a [3]int //数组的长度是数组类型的一部分
b := [3]int{1,2,3}
切片:基于数据做的一层封装,支持自动扩容,是一种引用类型,不能直接比较,只能和nil 比较
var name[]T
make 函数创造切片
s1 := make([]int ,2,3)
本质是对数组的封装,就是一个框,框住了一个连续的内存
指针
var a *int
map
内部使用hash类型,是引用类型
var m1 map[string]int
m2 := map[string]string{"task",task}
结构体
type person struct {
name string
age int
}
是值类型
匿名结构体
var p struct{
name string
age int
}
创建指针类型的结构体
闭包:闭包是一个函数,这个函数包含了他外部作作用域的变量
结构体
- new 和 make 都是用于申请内存,new 是给基本数据类型来开辟空间的,包括结构体(值类型),返回的是对应类型的指针;make是给特定类型开辟空间,返回的类型就是特定的类型
- 值接收者和指针接收者的区别:传拷贝进去和传内存地址进去,一般使用指针接收者
-
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) { 函数体 }
- 什么时候需要指针接收者:(1)当需要修改接收者中的值时;(2)接收者拷贝代价比较大的对象;(3)保持一致性,如某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者
- var a = int32(2) 变量初始化的一种方法 s1:=[]int(1,2,34)
- go 语言没有“继承”的概念,可以通过结构体实现其他语言中面向对象中的继承
- 结构体中字段大写开头表示可公开访问,小写表示私有(仅在定义当前结构体的包中可访问)。
方法和接收者
方法:作用于特定类型的函数;而函数不属于任何类型
值接收者和指针接收者的区别:传拷贝进去和传内存地址进去,一般使用指针接收者
结构体与JSON
接口
接口是一种类型,只规定了变量都哪些方法
type 接口类型名 interface{
方法名1( 参数列表1 ) 返回值列表1
方法名2( 参数列表2 ) 返回值列表2
…
}
空接口
type xx interface{}
interface{} 空接口没必要起名字,故通常定义成这样
package
并发
goroutine: 类似于线程,go语言从语言层面就支持线程,但是真正执行的还是落到操作系统线程上。但是go 语言就是作者帮实现了一个线程池,一个高效的线程池,让我们不再需要关注语言层面如何去调用操作系统的线程或进程去实现高并发,就类似于一个黑盒
goroutine和线程的区别:OS 的线程一般固定是2M 的栈内存,但是goroutine用代码层面实现的用户态的线程,在生命周期初期,只有很小的栈内存,2KB
通过goroutine 来实现一段时间内的多个任务的并发执行
channel :是一种类型,一种引用类型,用make 初始化
var ch1 chan int
slice、map 、chan 三种类型需要make 初始化