zoukankan      html  css  js  c++  java
  • Go语言结构体和方法

    struct的使用:

    1. 用来自定义复杂数据结构

    2. struct里面可以包含多个字段(属性)

    3. struct类型可以定义方法,注意和函数的区分

    4. struct类型是值类型

    5. struct类型可以嵌套

    6. Go语言没有class类型,只有struct类型

    struct声明

    type 标识符 struct {
           field1 type
           field2 type
    }
    
    例如:
    type Student struct {
           Name string
           Age int
    Score int
    }
    

     struct 中字段访问:和其他语言一样,使用点

    var stu Student
    
    stu.Name = “tony”
    stu.Age = 18
    stu.Score=20
    
    fmt.Printf(“name=%s age=%d score=%d”, stu.Name, stu.Age, stu.Score)
    

     struct定义的三种形式:

    var stu Student
    
    var stu *Student = new (Student)
    
    var stu *Student = &Student{}
    

    其中b和c返回的都是指向结构体的指针,访问形式如下

    stu.Name、stu.Age和stu.Score或者 (*stu).Name、(*stu).Age等

     struct的内存布局:struct中的所有字段在内存是连续的。

    package main
    
    import (
      "fmt"
      "sort"
    )
    type stru struct {
      Name string
      age int
      score int
    }
    
    func structtest(){
      s :=stru{
        Name:"alex",
        age:16,
        score:19,
      }
      fmt.Printf("%p
    %p
    %p
    ",&(s.Name),&(s.age),&(s.score))
    }
    
    func main(){
      structtest()
    }

    结果:

    0xc000004460
    0xc000004470
    0xc000004478

      

    struct链表:

    链表定义:

    type Student struct {
           Name string
           Next   *Student
    }
    

    每个节点包含下一个节点的地址,这样把所有的节点串起来了,通常把 链表中的第一个节点叫做链表头

    golang中的struct没有构造函数,一般可以使用工厂模式来解决这个问题  

    目录结构

    package model
    
    type Student struct {
      Name string
      Age  int
    }
    
    func NewStudent(name string, age int) *Student {   //返回地址
      //return &Student{
      //  Name: name,
      //  Age:  age,
      //}
      var stu *Student = new(Student)
      stu.Name = name
      stu.Age = age
      return  stu
    }
    var Re = 32
    model.go
    package main
    
    import (
      "./model"
      "fmt"
    )
    
    func main(){
      fmt.Println(model.Re)   //引用包内的变量
      S := new (model.Student)    //返回值类型
      S = model.NewStudent("tony", 20)
    
      fmt.Println(S.Name)
      fmt.Printf("%T",S)   //打印S类型
    
    }
    main.go

     make与new的区别

    make 用来创建map、slice、channel new用来创建值类型

    new用来创建值类型

    struct中的tag与序列化

    我们可以为struct中的每个字段,写上一个tag。这个tag可以通过反射的 机制获取到,最常用的场景就是json序列化和反序列化

    package main
    
    import (
      "encoding/json"
      "fmt"
    )
    
    type Student struct {
      Name  string `json:"student_name"`
      Age   int    `json:"age"`
      Score int    `json:"score"`
    }
    
    func main() {
      data, err := json.Marshal(stu)
      if err != nil {
       fmt.Println("json encode stu failed, err:", err)
       return
      }
      fmt.Println(string(data))
    }  

     struct的方法调用

    type A struct {
            a int
    }
    
    func (this A) test() {fmt.Println(this.a)
    }
    
    var t A
    t.test()
    

      

      

      

      

    I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我

  • 相关阅读:
    hausaufgabe--python 37 -- self in Class
    hausaufgabe--python 36-- Basic knowledge of Class
    hausaufgabe--python 35
    hausaufgabe--python 34
    hausaufgabe--python 33
    Retrofit2的使用简单介绍
    android中的Application作用
    第三章 Android控件架构与自定义控件详解
    第一章 Android体系与系统架构
    写在前面的话
  • 原文地址:https://www.cnblogs.com/weidaijie/p/11447961.html
Copyright © 2011-2022 走看看