go 定义类型
定义变量方式
定义变量时需要注意 在最外层一定要使用var 的方式定义变量不能使用 ':='的方式,只有在func 里面可以使用':=' 定义变量
字符串
1)是值类型,不是引用类型或指针类型
2)只读的byte slice
3)byte 数组可以放任何数据
var(
str string = "holle"
sum int = 1
enable bool = false
)
func test1(){
var str2 string = "你好"
str1 := "你好啊"
}
常量 iota 常量计数器 const 中每新增一行常量将使iota 计数一次
// _ 隐藏变量
// << 位移
const(
_ = 1 << (10 * iota)
kb
mb
gb
tb
pb
)
结构体 定义多种不同类型的参数,如 string、bool、int
type address struct{
province string
city string
}
接口 数组中的一种集合,具有相同属性的方法,可以使用接口类型定义。
type person interface{
方法名()
}
方法
type cat struct {}
func (c cat) speak(){
fmt.Println("喵喵.....")
}
map操作
func TestAccessNotExistingKey(t *testing.T){
//map 操作
//在访问的key不存在时,仍然返回零值,不能通过返回值nil来判断元素是否存在
// int 零值 0 ; string 零值 ""
m1 := map[int]int{}
t.Log(m1[1])
m1[2] =2
t.Log(m1[2])
if v,ok :=m1[3];ok{
t.Log("key exit value ",v)
}else{
t.Log("key not exit value ",v)
}
m2 := map[int]string{}
m2[1] = "nihao"
if value,ok := m2[3];!ok{
t.Log("key not exit value ",value,"name")
}
t.Log(m2)
}
map 的值 可以是一个方法;
与GO 的Dock type 接口方式在一起,可以方便的实现单一方法对象的工厂模式
func TestMapWithFcunValue(t *testing.T){
m :=map[int]func(op int)int{}
m[1] =func(op int)int{return op}
//计算平方
m[2] = func(op int)int{return op*op}
// 计算立方
m[3] = func(op int)int{return op*op*op}
t.Log(m[1](2),m[2](2),m[3](2))
}
通过map实现set 相关的特性
func TestMapForSet(t *testing.T){
mySet := map[int]bool{}
mySet[1] = true
n:=3
// 判断mySet 的key 是否存在
if mySet[n] {
t.Logf("%d is existing",n)
}else{
t.Logf("%d is not existing",n)
}
mySet[3] = true
t.Log(len(mySet),mySet)
//删除key
delete(mySet,1)
t.Log(mySet)
}