学习了几天go语言,谈一下感想吧,自动格式化代码(统一代码格式)、支持多返回值、导入包和定义变量必须使用、切片、协程等,感觉是结合了各种语言的优点,当然也有我觉得不太爽的,就是结构体的属性和方法不在同一个花括号定义,这样没有java那样清晰,interface的方法就是在一个花括号里边的,为啥就不能放一起呢,如果我的一些子类既有共同属性和方法,那么我就要定义一个结构体保存通用属性,作为子类们的一个属性来引用,通用的方法通过实现interface的方法来实现,感觉不太方便。
一、go语言特性
1.go语言一定要有一个main包 package main , 同一目录的包名相同
2.main方法是程序的唯一入口 func main(){
}
3.变量定义和初始化 var i int = 1 or i int := 1
4.常量使用const关键字 const i int = 10
5.用import关键字引入包 引入的包或者定义的变量必须被使用,否则编译报错 ,好处就是保证你引入的资源定义的变量常量都是有用的,减少不必要的加载
6.if条件语句与其他语言不太一样,可以由两部分组成 if statement;expressCondition{
}
7.switch跟其他语言也不一样,可以不写条件,默认是true
switch{
case expressCondition1:
statement1//默认加了break
case expressCondition2:
statement2
fallthrough //放行下一个case
case expressCondition3:
statement3
}
8.结构体的定义 type Cat struct{//type structName struct
Name string //名称 类型 首字母大写代表public
age int //名称 类型 首字母小写代表private
Color //可以不写字段名 引用的时候直接cat.Color
}
9.结构体的方法定义,func与方法名之间要加上接收者 func (cat Cat) eat(){
cat.XXX...
}
10.interface 接口定义 type interfaceName interface{
method1()
method2()
}所有实现了接口的方法的类就实现了该接口。
11.切片 可以动态扩容 ,用make、append方式定义、追加元素。
12.for...range循环,有的数据结构range可以返回两个值,比如数组会返回下标和数据,对于多返回值不用的字段可以使用_丢弃,这一点跟python很像。
for i,data range array1{
}
13.go引入了goroutine 协程比线程的粒度更小,用go关键字就可以让一个函数新启一个协程执行不阻塞主线程,但是如果程序有返回值会被丢弃
14.channel 通道 ,为了解决与协程之间的数据共享 通过通道缓冲区读写数据
15.select 跟switch类似的使用方式,但是只能用于通道chan
二.代码demo
switch语句 switch_test.go
package main
import (
"fmt"
)
func classChecker(items ...interface{}){//interface可以代表所有类型
for i,x := range items{
switch x := x.(type){//.(type)写法必须与switch case联合使用 获取实际的类型指针
case bool:
fmt.Printf("param #%d is a bool,value : %t\n",i,x)
case float64:
fmt.Printf("param #%d is a float64,value : %f\n",i,x)
case int,int8,int16,int32,int64:
fmt.Printf("param #%d is a int,value : %d\n",i,x)
case uint,uint8,uint16,uint32,uint64:
fmt.Printf("param #%d is a uint,value : %d\n",i,x)
case nil:
fmt.Printf("param #%d is a nil\n",i)
case string:
fmt.Printf("param #%d is string,value : %s\n",i,x)
default:
fmt.Printf("param #%d's type is unknow\n",i)
}
}
}
func main(){
classChecker(5,-17.98,"AIDEN",nil,true,complex(1,1))
}
运行:go run switch_test.go
结果:
类型转换和断言
package main
import (
"fmt")
func main() {
x := uint(65000) //定义一个uint类型变量x
y := int16(x)//将x强转成int16
fmt.Printf("type and value of x is:%T and %d\n",x,x)
fmt.Printf("type and value of y is:%T and %d\n",y,y)
var i interface{} = 99
var s interface{} = []string{"left","right"}
j := i.(int)
fmt.Printf("type and value of j is:%T and %d\n",j,j)//打印j变量的类型和值,%T是类型 %d是数字
if s,ok := s.([]string);ok {//if statement;expressCondition{} resultOfType,boolean := obj.(type) 安全的类型断言 如果boolean值是true说明转换成功
fmt.Printf("%T -> %q\n" , s,s)
}
}
运行:go run type_test.go
结果: