Go语言:属于云计算时代的C语言,提高生产效率
代码包导入方法: 调用方法使用:
import str "strings" str.方法()
import ."strings" 方法
import_ "strings" 无法调用任何方法
应用程序入口:
1,必须是main 包:package main
2,必须是main方法:func main()
3,文件名不一定是main.go
Test文件规定:
1,文件必须以**_test.go
2,func Test*** (t *testing.T){}命名
基本类型:
bool,string
int int8 int16 int 32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte
rune
float32 float 64
complex64 complex128
与其他主要编程语言的差异:
1,go语言不允许隐式类型转换
2,别名和原有类型也不能隐士类型转换
3,不支持指针运算
4,string 是值类型,不是引用类型,其默认是初始化为空,不是nil 也不是null
运算符:
算术运算符
+,-,*,/,%,++,--
注意:
1,% 取模时,可以等价 A%B = A-A/B*B
2,/ 时,整数之间是是保留整数,不是四舍五入
3,golang中++ 只能当作独立语句,不能 if i++ >0{}
4,go 语言没有前置的++,-- 类似 : ++a
赋值运算符
逻辑运算符:
&&,||,!
关系运算符
==,!=,>,<,>=,<=
位运算符
&^ 按位置:若右边为0,则按照左边的值输出,若右边为1则输出0
其他运算符:
& 返回变量存储地址
* 指针变量
运算符优先级:
创建变量:
1,var name type :
2,多个变量声明:
3.name := value / name,age:=value1,value2:
4,声明一个指针变量:
数组的声明 :
var a[3] int
b:=[3]int{1,2,3} |
c:=[2][2]int{{1,2},{3,4}}
a:= [...]int{0,1,2,3,4}
数组截取: a[开始的索引(包含):结束索引(不包含)]
eg: a[:3](a[0:3]) == {0,1,2} a[1:] (a[1:len])=={1,2,3,4} a[1,3] = ={1,2}
切片Slice 的声明:
是 切片 包括:ptr len (长度) cap(容量)
1,var s0 []int s0.append(s0,1)
2,s :=[]int{}
3,s:=[]int{1,2,3}
4,s:=make([]int,2,4) make(type,长度len,容量cap) 仅能访问len个元素,因为只有len元素被初始化。
append 方法是往切片里添加数据,若cap>len 此时len+1, 但cap 不会改变
若cap==len后 ,cap会乘2 增长
切片截取:
通过截取后,len是截取的长度,但是cap是从截取位置开始,一直共享存储结构尾部,当修改一个后,会对共享的切片结构影响,改变共享的值
数组VS切片: 容量是可以进行伸缩,没有长度限制,
关键字:
go语言只支持for 循环关键字:
基本for循环:for i:=1;i<n;i++{}
while条件循环: for n<5 {}
while 无限循环 for{}
类似java:foreach 的方法:
1,for index,e:=range 存储容器(数组,map){}
2,for _,e:=range 存储容器 {} (由于go中没有被引用的参数会被报错,所以使用 “_ ” 替代不被用的参数)
swich
1,条件表达式不限制常量或者整数
2,单个case 可以出现多个结果选项,使用逗号分隔
3,与C语言规则相反,不需要break
4,可以不设定switch 的条件表达式,类似if else 的逻辑
Map的声明:
1,m := map[string]int{"one":1,"two":2}
2, m:=map[string]int{} m["one"] =1
3,m:=make(map[string]int,10(cap))
注意:
map需要主动取判断 获取到的0值,是否是给定的值,还是默认初始化的值(如果业务上有需要)
Map 与工厂模式:
Map 的Value 可以是一个方法:
Set:
Go的内置集合没有Set实现,可以使用map[type]bool 实现
字符串:
1,string是数据类型,不是引用或指针类型
2,string是只读的byte的切片 slice,len函数是指它所包含的byte数
3,string 的byte数组可以存放任何数据
函数:
go的函数是一等公民:
1,可以有多个返回值
2,所有参数都是值传递:slice map channel 会有传引用的错觉
3,函数可以作为变量的值
4,函数可以作为参数和返回值
5,可变参数
defer 函数
类似java中的finally 代码最终会被执行。
panic 程序异常中断,之后的代码 不会被执行,但是defer 的代码会被执行
面向对象:
封装:实例创建
两种传值参数,带*指针的对象,指向的是相同的对象,不会进行值复制,消耗内存。
接口:
与其他语言的差异:接口非入侵性,实现不依赖接口定义,接口的定义可以包含在接口使用者包内
自定义类型:
扩展与复用:
1.使用这种指针的标记,调用Pet 内的方法,需要:
2,直接填写Pet 可以直接调用pet 内的方法
多态:
接口对应的只能是指针类型。goProg := & (符号必须存在,代表指针类型)
有疑问加站长微信联系(非本文作者)