Go语言基础

223 阅读2分钟
  1. 数组需要定义长度
  2. 切片是对数组的一个连续片段的引用 在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语言程序传参

  1. 使用os.Args
  2. 使用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")
}