1.变量和常量
常量: const 变量名 type
变量: var 变量名 type
2.变量定义
变量:
- var 语句用于声明一个变量列表,跟函数的参数列表一样,类型在最后
- var c,python,java bool
变量的初始化:
变量声明包含初始值,每个变量对应一个
如果初始化值已存在,则可以省略类型;变量会从初始值中获得类型
var i, j int = 1,2
短变量声明
在函数中,简洁赋值语句 := 可在类型明确的地方代替var 声明
函数外的每个语句都必须在关键词开始(var,func等),因此 := 结构不能再函数外使用。
c, python, java := true, flase, "no!"
3.类型转换和推到
类型转换
表达式T(v) 将值v转换为类型T
一些关于数值的转换
var i int = 42
var f float64 = float64(i)
var u unit - uint(f)
更简单的形式:
i := 42
f := float64(i)
u := uint(f)
类型推导
在声明一个变量而不指定其类型是,变量的类型由右值推导得出。
var i int
j := i
4.数组
- 相同类型且长度固定连续内存片段
- 以编号访问每个元素
- 定义方法 var 变量名[len] type
- myArray := [3]int{1,2,3}
5.切片(slice)
- 切片是对数组一个连续片段的引用
- 数组定义中不指定长度即为切片
- 切片再为初始化之前默认为nil,长度为0
-
func main(){ myArray := [5]int{1,2,3,4,5} //这一部分就是定义的切片内容 ,从下标1到下标3结束 mySlice := myArray[1:3] //定义切片 mySlice1 := []int{} //在使用切片的时候,是不太用关心长度的,go语言自己就管理了 mySlice1 = append(mySlice1, 1) //通过append就把切片给添加进来了,添加的时候,go语言会帮助进行扩充 //但是要删除切片元素就很麻烦了 } //删除切片元素,需要把元素前面的和元素后面的组成一个新的切片 func deleteitem(slice []int. index int)[] int { return append(slice[:index], slice[index+1], .....) }
6.Make和New
- New返回指针地址
- Make返回第一个元素,可预设内存空间,避免未来的内存拷贝
-
Myslice1 := new([]int) Myslice2 := new([]int, 10)
Go语言是按值传递
mySlice := []int{10,20,30,40,50}
for _,val := range mySlice {
val *= 2
}
//这个val值不会影响mySlice值,因为GO语言是按值传递,会复制一份临时变量
//如果想要修改,就需要下面的操作
for index, _ := range mySlice{
mySlice[index] *= 2
}
7.Map
声明方法: var map1 map[keytype]valuetype
//声明map方法1
myMap := make(map[string]string, 10)
myMap['a'] = "b"
//声明map方法2
myFuncMap := map[string]func() int {
"funcA": func() int { return 1 }
}
fmt.Println(myFuncMap)
f := myFuncMap["funcA"]
fmt.Println(f())
//遍历map方法
value, exists := myMap["a"]
if exists {
fmt.Println(value)
}
//遍历
for k, v := range myMap {
print(k,v)
}
8.结构体指针
- 通过type.....struct 关键字自定义结构体
- Go语言支持指针,但是不支持指针运算
- 指针变量的值为内存地址
- 未赋值的指针是nil
//定义接口,接口里面只能定义行为
type If interface {
getName() string
}
//定义结构体,结构体里面只能定义属性
type Human struct{
name,age string
}
func main(){
h1 := Human{}
//h1 就是human的指针变量
//new也是出来结构体变量指针
h1 := new(human)
}
9.结构体标签
- 结构体中的字段除了有名字和类型外,还可以有一个可选的标签(tag)
- 使用场景: k8s APIserver 对所有资源的定义都用json tag 和 protobuff tag
- nodeName string ·json:"nodeName,omitempty·