作为一名已接触过其他语言的开发,再去学习一门新语言可比之前轻松不少,
语言之间存在很多相似点,但是新语言也有自己的不同点,通常我会先了解它与其他语言常遇到的不同点有哪些,
使自己先能够上手编写基础程序,然后学会能够上手运用语言的各类常见框架,最后再理解新语言更深层的差异。
Go 知多少?
- 启动文件是
main
包,main 函数应该存在 main 包中 - 基本调用单位是包,包内共享所有源文件的变量、常量、函数和其他类型,不同包之间函数调用通过包名访问(前提是导入包名,禁止直接或者间接的循环导包)
- 变量、函数等首字母大写可以将其导出供外部访问,首字母小写则表示不对外暴露;同样的
internal
包表示私有包 - 占位符
_
,可用于各种赋值操作 - 不存在隐式类型转换
- 代码块之间变量的作用域是相互独立的
- 条件控制标签 label 的使用通常和 goto、break、continue 一起使用,
goto A、break A、continue A
,会跳转到标签为 A 的代码块 - 循环控制 for index,value := range iterable {}
- 数值 0 和非 0 不能替代为 bool 类型
- 整型渠道 chan int,字典 map[key-type]value-type,数组 []type
nil
不等于其他语言中的 null,nil 不属于任何类型,它只是部分类型的默认值(go 希望错误可控,通常错误信息通过函数、方法返回,你可以认为 != nil 表示存在错误,函数调用等返回错误,需要错误处理)
//典型的异常判断
file,err := os.Open("a.txt")
if err != nil{
//文件打开错误,输出错误信息 err
fmt.Println("文件打包失败:",err)
} else {
//文件读取成功
}
//如何创建一个错误
err := errors.New("打开失败!")
//支持格式化参数
err := fmt.Errorf("%d 号文件打开失败!",10)
- 常量表示使用
const
,只能是基本类型,也可以这样使用 const( Name=“lf” Age = 18 Sex = “male”) - 变量表示使用
var
,var var-name type;编译器自动推断变量类型 var-name:= “lf” - 数组是定长的数据结构,切片是不定长,当容量不够时自动扩容;数组切割是 arr[start:end]
左闭右开
(包含左边的索引值,不包含右边的索引值) - 切片:没有指定固定长度的数组?推荐使用 make 创建空切片,切片的使用和数组类似,切片的容量是可变的,容量大小是根据切片的长度自动调整的
- 字符串本质是一个不可变的只读字节数组,对字符串的操作和切片一致,所以对于字符串可以描述的数据类型有:string、byte、rune;
- 字符串表示除了使用双引号,还有反引号(反引号不需处理转义字符)
- 结构体标签,常见在 json 解析:type Student struct {
Name stringjson:"name"
} - 函数是可以有多个返回值,func GetStudentInfo(id int)(name string, number int){};如果 return 没有指定返回的变量,那么紧跟 return 语句的那个值就是返回值
- 延时调用
defer
,表示在函数返回前执行(用法类似 java try 块的 finally?),往往和匿名函数一起使用 - 方法的定义(请与
函数
区别开),方法:只有自定义来才拥有
///函数
func GetName()string{
return "lf"
}
///方法
//自定义类型
type IntArrType []int
//方法声明
func (it IntArrType)GetNumber(index int)int{
//it 可以看作是自定义类型本身(Java 中的 this?)
return it[index]
}
//使用
var numbers IntArrType
numbers = []int{11,22,33,44}
var num = numbers.GetNumber(0)
- 空接口:type Any interface {},所有类型都是空接口的实现,Any 接口可以保存任何值(Java 的 Object?)
var who Any
who = “lf”
who = 18
- 匿名空接口:interface{},作为函数参数时表示可以接受任意类型的值
func Who(anything interface{})
,后续可以直接使用 Any - 基本接口:一组方法的集合,定义的方法可以不写参数名称、返回值名称(可以只写类型)
- 通用接口:包含类型集的接口(啥是
类型集合
:集合可不可以理解成切片、数组?类型指的是基本类型?类型集——一个切片,元素是基本类型的数组)[int,string,int32]
- 范型:大致意思可以理解为 Java 里面的范型
//已用在函数上为例,T 可以理解为占位符,主要是类型约束着一块
func Append[类型约束](str1,str2 T)T{
}
- 静态强类型:静态表示变量类型在编译期间确定下来,之后不会发生变化;强类型指的是运行过程中严格进行类型检查
- 类型断言:和 Java 中的 instance 用法相似
var a = 1
val,is := a.(int);
if is{
//a 属于 int 类型
}
- 类型判断:和 Java 中的 instance 用法相似
var a = 1
switch a.(type){
case int:
case float64:
case string:
}
- 异常 panic:go 运行时异常
//调用 panic 终止运行
panic("文件打开失败!")
//在抛出 panic 之后你仍然想保持程序继续运行,可以执行恢复操作
//调用 recover 通常在函数延时调用中处理
recover()
//退出程序,通常在遇到严重错误时调用
os.Exit(1)
- 包管理 go mod:执行
go env
或查看配置文件more .bash_profile
检查确认配置GO111MODULE
是否开启(on/off/auto);通常我们没有梯子,也推荐配置包下载来源代理GOPROXY
,避免因为网络问题阻碍编码进行。
到此为止吧~
算是进一步重新认识 Go,
剩下的并发、反射等在后续开发过程中逐个学习,
那么接下来可以实操项目了!