十八、GO语言的结构体(struct)

 

基本介绍

  1.从概念或叫法放上看:结构体的字段=属性=field

  2.字段是结构体的一个组成部分,一般是基本数据类型、数组,也可以是引用类型

  3.在创建一个结构体变量后,如果没有给字段赋值,都对应一个默认值,具体值与字段类型相关。如果是切片或者map之类的类型,则需要make后才可以使用该字段,因为只是声明了字段,并没有分配内存空间

  4.不同结构体变量的字段是独立的,互不影响,一个结构体变量字段的更改不会影响另外的结构体

  5.结构体默认是值类型,使用时会默认进行值拷贝,比如赋值给另一个结构体或者进行函数传递的时候,如果想要同步改变,则可以进行指针传递

 

结构体的基本语法

  var person struct{

    name string

    age int

  }

结构体的声明,推荐使用第一种或者第二种

  方式一

  var person Person

  person.name = "张三"

  person.age = 18

  方式二

  var person Person = Person{}

  person.name = "张三"

  person.age = 18

  方式三,结构体指针

  var person *Person = new(Person)

  person.name = "张三"

  person.age = 18

  方式四,结构体指针

  var person *Person = &Person{}

  person.name = "张三"

  person.age = 18

  方式五

  person := Person{}

  person.name = "张三"
  person.age = 18

  结构体指针访问字段的标准方式应该是:(*结构体指针).字段名,比如(*person).Name=  "张三",但GO语言做了一个简化,也支持 结构体指针.字段名,比如person.Name="张三"。更加符合程序员的使用习惯,GO编译器底层对person.Name做了转化(*person).Name
 
结构体使用的注意事项
  1.结构体所有字段在内存中是连续的
  2.结构体是用户单独定义的类型,和其他类型进行转换时需要有完全相同的字段名(字段数量,字段类型,字段名称)
  3.结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型,但是相互间可以强转
  4.在结构体的每个字段上,可以写一个tag,该tag可以通过反射机制获取,常见的使用场景就是序列化和反序列化
  

 

 

给结构体定义方法,自定义的类型都可以有方法

方法的声明和调用

  

 

上图中的test()就是Person的方法,

如方法内部不需要使用该该结构体,可以省略p

func (Person) test(){

  fmt.Print("person.name",p.name)

}

 

方法的注意事项

  1.结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式

  2.如希望在方法中修改结构体变量的值,可以通过结构体指针的方式来处理,如func (p *Person) test()

  3.golang中的方法作用在指定的数据类型是行,因此自定义类型都可以有方法,而不仅仅是struct,比如int,float32等。

  4.方法的访问范围控制的规则和函数一样,方法名手写字母小写,只能在本包访问,方法首字母大写,可以在本包和其他包访问

  5.如果一个变量实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出

  
方法和函数的区别
  1.调用方式不一样
    函数的调用方式:函数(实参列表)
    方法的调用方式:变量.方法名(实参列表)
  2.对于普通函数,接受者为值类型,不能讲治镇类型数据直接传递,反之亦然
  3.对于方法(如struct的方法),接受者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以
 
  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章