go从0到1项目实战体系八:struct结构体

1. 概念:

. 用来自定义复杂数据结构.. struct中可以包含多个字段(属性).. struct类型可以定义方法,注意和函数的区分:
    (1). 可以将一些方法和结构体关联

④. struct类型是值类型,只有传指针,才能修改值.. struct类型可以嵌套.. Go语言没有class类型,只有struct类型.

2. 声明:

. 定义:
    type 标识符 struct {
      field1 type
      field2 type
    }

3. 操作:

type Student struct {
  Name string
  Age int
}. 定义方式1(定义值类型):
    var stu Student
    // 赋值
    stu.Name = "tony"
    stu.Age = 18
    // 访问字段
    fmt.Printf("name=%s age=%d score=%d", stu.Name, stu.Age, stu.Score). 定义方式2(定义值类型) - 创建一个结构体值类型:
    var stu Student = Student{
      Name: "david"                       // 只初始化部分变量
    }. 定义方式2(new分配一个结构体):
    var stu *Student = new(Student)       // 返回指向结构体的指针,在c语言new声明内存空间,要自己释放. 定义方式3:
    var stu *Student = &Student{          // 返回指向结构体的指针
      Name: "david",
      Age: 11,
    }
    (*stu).Name、(*stu).Age

(1). 内存布局:

. struct中的所有字段在内存是连续的.. 两个指针是连续的.指针指向的内存地址不是连续的.

怎么证明是连续的?

(2). 单链表:

. 数组定义几个元素,长度就是固定的,是连续的地址空间.这样就可以通过下标来访问.. 结构:
   type Student struct {
     Name string
     Next* Student    // 指向另外一个结构体
   }
   a. 相当于一根绳子,把所有结构体串起来.
   b. 链表就是每个节点包含下一个节点的地址,把所有的节点串起来了.
   c. 通常把链表中的第一个节点叫做链表头,最后一个节点指针是nil.
   d. 链表地址是不连续的,next地址是分配的.大小也不是固定长度的.
   e. 如果最后一个节点的指针指向第一个节点的地址,就是循环单链表.. 弊端:
   a. 只能从头往后走.
   b. 删除其中一个节点,只能将它上一个节点的指针指向它下一个节点的地址.

(3). 单链表代码(尾部插入法,都是在每个节点的尾部进行插入):

type Stu struct {
	Name string
	Next *Stu
}
func main() {
  // 普通节点赋值
	stu1 := &Stu{Name: "david"}
	stu2 := &Stu{Name: "lily", Next: nil}
	stu1.Next = stu2            // 将stu2加入stu1中的Next
	var p *Stu = stu1           // 定义头节点
	for p != nil {
		fmt.Println(*p)           // {david 0xc0000044a0}    {lily }
		p = (*p).Next
  }
  // 循环
  
}

你可能感兴趣的:(golang,开发语言,后端)