zoukankan      html  css  js  c++  java
  • 十八、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的方法),接受者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以
     
      
  • 相关阅读:
    收藏夹
    获取某个元素在页面上的偏移量
    React多行文本溢出处理(仅针对纯文本)
    react
    CDN初学搭建(ats)
    linux查看cpu、内存、版本信息
    MySQL5.6版本性能调优my.cnf详解
    How to install cacti on centos 6
    win10安装.net3.5 报错解决
    CentOS6.5安装Cacti统计图乱码解决
  • 原文地址:https://www.cnblogs.com/WORDPAD/p/15149440.html
Copyright © 2011-2022 走看看