go语言基础入门(1月14第二天)

68 阅读3分钟

当青训营遇上码上掘金

切片

go数组长度是不可变的, 简单理解切片为动态数组, 长度是可以变化的

可以从数组生成切片(和python的切片操作差不多)

var a  = [3]int{1, 2, 3}
fmt.Println(a, a[1:2])	// [1 2 3] [2]
// start ,end 底层调用大概是取出的length = end - start 左开右闭
  • 声明切片
// 声明字符串切片
var strList []string // ==nil
// 声明整型切片
var numList []int	//==nil
// 声明一个空切片
var numListEmpty = []int{} //初始化为空了,!=nil

变量名的命名驼峰

  • 使用make()内置函数制造切片 var a := make([]int, 2, 2)

  • append内置函数可以为切片动态添加元素(这个重载的方法有点多, 看API)
var a []int
a = append(a, 1) // 追加1个元素
a = append(a, 1, 2, 3) // 追加多个元素, 手写解包方式
a = append(a, []int{1,2,3}...) // 追加一个切片, 切片需要解包

如果空间不足以容纳足够多的元素,切片就会进行“扩容”原来的地址会改变,猜测底层应该和(Stringbuffer)类似

  • 内置函数len(), cap()分别表示长度和容量
  • copy():Go语言的内置函数 copy() 可以将一个数组切片复制到另一个数组切片中,如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制。

range关键字:循环迭代(返回两个值)

for index, value := range slice {
    fmt.Printf("Index: %d Value: %d\n", index, value)
}  // index 相当于索引下标  

range 关键字不仅仅可以用来遍历切片,它还可以用来遍历数组、字符串、map 或者通道等

range 关键字不仅仅可以用来遍历切片,它还可以用来遍历数组、字符串、map 或者通道等

for _, value := range slice {
    fmt.Printf("Value: %d\n", value)
}

map

map 这种数据结构在其他编程语言中也称为字典(Python)、hash 和 HashTable

mapCreated := make(map[string]float)等价于mapCreated := map[string]float{}

map 的遍历过程使用 for range 循环完成

结构体

一个程序就是一个世界, 有很多对象

  • 没有类(class), 其中的struct与其他语言的class有同等地位
  • 去掉了传统的OPP语言的继承、方法重载、构造函数、隐藏的this指针
  • 面向接口编程,用到了极致

结构体名称的大写表示的是可以在其他的包内进行访问, 小写表示私有,内部的变量名称也是一样

如果结构体的字段是: 指针, slice,和map的零值都为nil,表示还没有分配空间,如果要是要使用需要先make()

  • 创建的方式
  1. 直接声明: var person Person
  2. var person Person = Person{}
  3. var person *Person = new {Person} new出来的是指向结构体的指针

var p *Person = new {Person}

(*p).Name = "why" // 应该有的写法

p.Name = "why" // go的设计者为了使用方便,在底层做了优化

  1. var person *Person = &Person{}