- 数组需要定义长度
- 切片是对数组的一个连续片段的引用 在Go中最常用的就是切片 定义空切片
emptySlice := []int{}
fmt.Printf("emptySlice: %+v, type: %T, address: %p\n", emptySlice, emptySlice, emptySlice)
emptySlice: [], type: []int, address: 0x57b400
切片添加元素
slice1 := append(emptySlice, 1)
slice1 = appen(slice1, 2)
切片删除元素:
func deleteItem(slice []int, index int) []int {
return append(slice[:index], slice[index+1]...)
}
切片的创建 new([]int) make([]int) make([]int, 10)
go中默认是按值传递的
map的定义
aMap := map[string]func() int{
"funcA": func() int {
return 100
},
}
fmt.Println("aMap is : ", aMap)
f, exist := aMap["funcA"]
if exist {
fmt.Println("key existed and func call value: ", f())
} else {
fmt.Println("the key does not exist")
}
for k, v := range aMap {
fmt.Println(k, v)
}
type structDemo struct {
Name string json:"name"
}
结构体中字段除了名字和类型外,还可以有个可选标签(tag)
使用场景:Kubernetes APIServer 类型别名type ServiceType string
每个Go程序都有一个main package,main package 中的main函数是Go语言程序的入口 Go语言程序传参
- 使用os.Args
- 使用flag 定义参数,flag.Parse()
init函数会在包初始化时运行 距离kubernetes->glob->init->flag parse parameters kubernetes -> a -> vendor -> glob -> init -> flag parse parameters
函数的返回值可以被命名,会被视为函数顶部的变量 `
func DuplicateString2(input string) (err error, result string) {
if input == "aaa" {
err, result = fmt.Errorf("aaa is not valid"), ""
return
}
err, result = nil, input+input
return
}
`
变长参数
func append(slice []Type, elems ...Type)[]Type {
}
内置函数(顶级函数)
| 函数 | 功能 |
|---|---|
| close | 关闭管道 |
| len,cap | 返回数组、切片和Map的长度和容量 |
| new, make | 内存分配 |
| copy, append | 操作切片 |
| panic, recover | 错误处理 |
| print, println | 打印 |
| complex, real, imag | 操作复数 |
callback函数 把函数作为参数传递
闭包 (匿名函数) Q:为什么定义函数? A: 为了抽象,将一功能或一个完整的逻辑进行包装定义,其目的是为了重用或复用。其好处是代码已于阅读,逻辑清晰 有时候让其中一段逻辑独立运行,可以使用匿名函数。 匿名函数不能独立存在, 可以赋值给其他变量,可以直接调用,也可以作为函数返回值 匿名函数定义的地方都叫做闭包。
方法 func (recv receiver_type) methodName(parameter_list)(return_value_list)
多态 []IF
reflect.TypeOf() reflect.ValueOf()
json包使用map[string]interface{}, []interface{}保存任意对象
recover and panic
package main
import (
"fmt"
)
func main() {
defer func() {
fmt.Println("program finally call")
if err := recover(); err != nil {
fmt.Println("program panic and recover", err)
}
}()
fmt.Println("before panic")
panic("a panic and recover demo")
}