Go基础部分

学习Go基础之后的一些重要注意事项

Slice

切片可以理解为三个指针维护下的数组
ptr, len, cap

var arr = [5]int // 标准数组,标准数组直接可以==比较,切片只是个引用,是不能直接比较的
var b = []int{} // 这是已经进行了初始化的,它不等于nil
var slice2 []string // 它等于nil

var slice3 = make([]int, 5, 100) // 给两个初始值,一个是初始化的容量,一个是cap大小
slice3 := make([]int, 0, 16) // 初始一个空的

Map

// map的创建
m = make(map[string]int) // 可以初始化大小也可以不

// map通过这个判断有无key,但是如果一般操作的时候,可以直接用就行,不用初始化不会报错
if v, ok = map["key"]; ok {
	fmt.Println(v)
} else {
	fmt.Println("not exists")
}

指针

要合理的理解指针,在内存当中,我们的数据都是放在一个专门的地址上的。我们使用的是地址上对应的值。而指针,就是指向这个内存地址的变量。

  • *&操作,去获取一个变量的内存地址
  • *操作,去读取这个内存地址对应的值

在for循环遍历的时候
for i, v := range str //
这里的v是一个内存空间,每次会指向str的单个值,所以到最后这个空间都是这个值。

再加上go语言中是值传递的,如果是传递指针的值也是值传递,它都是进行一份拷贝以后才会进行方法

Defer

Go语言中的return并不是一个原子操作,它进行了两步

  • 对return的值赋值
  • 执行ret

而defer做的就是在中间插入一个这个方法的执行,这时已经获取了这个方法所有的args,只是延缓执行罢了。而多个defer,第一个defer的最后执行,相当于它已经融入了ret当中,而下一个还是往中间插入。
经典面试题来了:
image

闭包

闭包这个概念一开始还是难理解,后面我就干脆不想理解它了,就把一个方法当成是一个变量,它其中的东西都被继承执行了。

结构体

在Go里面只有结构体这个思想的。
结构体对象其实只是一个指针,它指针指向了这个结构体内存的最开始的地方,然后平铺补齐内存

type Student struct {
	ID int `json:"id"`
	Address string
	name string // 小写是一个私有对象,不能在包外访问,也不可以被json序列化
}

type Class struct {
	ID int
	Students []*Student
        *Student // 这是内嵌的方式,可以直接.使用里面的方法,剩下了代码的量
}

func main() {
	c := &Class{
		Title:    "101",
		Students: make([]*Student, 0, 200),
	}

	for i := 0; i < 10; i++ {
		c.Students = append(c.Students, &Student{
			ID:     i,
			Gender: "g",
			Name:   strconv.Itoa(i) + "g",
		})
	}
	//JSON序列化:结构体-->JSON格式的字符串
	//私有不能被json包访问
	//data, err := json.Marshal(c)
	//if err != nil {
	//	fmt.Println("json marshal failed")
	//	return
	//}
	data, err := json.Marshal(c)
	if err != nil {
		fmt.Println("json marshal failed")
		return
	}
	fmt.Printf("json:%s\n", data)
	//JSON反序列化:JSON格式的字符串-->结构体
	str := `{"Title":"101","Students":[{"ID":0,"Gender":"男","Name":"stu00"},{"ID":1,"Gender":"男","Name":"stu01"},{"ID":2,"Gender":"男","Name":"stu02"},{"ID":3,"Gender":"男","Name":"stu03"},{"ID":4,"Gender":"男","Name":"stu04"},{"ID":5,"Gender":"男","Name":"stu05"},{"ID":6,"Gender":"男","Name":"stu06"},{"ID":7,"Gender":"男","Name":"stu07"},{"ID":8,"Gender":"男","Name":"stu08"},{"ID":9,"Gender":"男","Name":"stu09"}]}`
	c1 := &Class{}
	err = json.Unmarshal([]byte(str), c1)
	if err != nil {
		fmt.Println("json unmarshal failed!")
		return
	}
	fmt.Printf("%#v\n", c1)
}
posted @ 2022-10-09 16:50  azxx  阅读(8)  评论(0编辑  收藏  举报