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\n%p\n%p\n",&(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()

  

 

  

  

  

posted @ 2019-09-02 17:53  离人怎挽_wdj  阅读(463)  评论(0编辑  收藏  举报