首页 > 其他分享 >go中的结构体struct

go中的结构体struct

时间:2024-03-01 17:55:26浏览次数:18  
标签:Name Age cat person3 go model 结构 struct

结构体的介绍:

  1. golang支持面向对象,是基于struct来实现OOP特性的,相当于Java中的class类。
  2. golang去掉了传统的oop语言的继承,方法重载,构造函数和析构函数,隐藏的this指针。
  3. golang仍然有面向对象编程的继承,封装和多态的特性。但是golang的继承没有extends关键字,继承是通过匿名字段来实现的。
    代码举例:
package model
// Cat 定义一个结构体
type Cat struct {
	Name  string
	Age   int
	Color string
	Hobby string
}

package main
import (
	"fmt"
	"mygo_code/chapter8/demo08/model"
)
func main() {
	//创建一个cat的变量
	var cat model.Cat
	cat.Name = "小白"
	cat.Age = 1
	cat.Color = "白色"
	cat.Hobby = "玩耍"

	fmt.Println("cat=", cat)//cat= {小白 1 白色 玩耍}

}

结构体变量在内存的布局

如何声明结构体

type 结构体名称 struct{                type Student struct{                                        
 field1 type                             Name string
 field2 type                 ->          Age int
}                                     }

字段/属性:
基本介绍:字段是结构体的一个组成部分,一般是基本数据类型,数组,也可是引用类型。比如我们前面定义猫结构的Name string就是属性。
细节:

  1. 字段声明语法同变量,示例:字段名 字段类型。Name string
  2. 字段的类型可以为:基本类型,数组或引用类型。
  3. 在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值)。指针,slice,和map的零值都是nil,即还没有分配空间。
  4. 不同的结构体变量的字段是独立的,互不影响,一个结构体变量的字段的更改,不影响另外一个,结构体是值类型。
	var m1 model.Monster
	m1.Name = "小怪兽"
	m1.Age = 500

	m2 := m1 //这里其实把m1的值拷贝了一份给m2
	m2.Name = "大怪兽"
	fmt.Println("m1=", m1) //m1的Name没有被修改  因为结构体是值类型
	fmt.Println("m2=", m2)

创建结构体的方式

func main() {
	//创建结构体的方法1
	var person model.Person //定义一个Person结构体
	person.Name = "张三"      //给结构体赋值
	person.Age = 18         //给结构体赋值
	fmt.Println("person=", person)
	//创建结构体的方法2
	person2 := model.Person{
		Name: "李四",
		Age:  19,
	}
	fmt.Println("person2=", person2)
	//创建结构体的方法3
	var person3 *model.Person = new(model.Person) //使用new函数创建结构体 返回的是结构体的指针
	(*person3).Name = "王五" //因为person3是指针,所以需要使用*person3来访问结构体的属性
	person3.Age = 20 //也可以这样使用 go的设计者为了简化代码,提供了这种简写形式
	fmt.Println("person3=", *person3) //person3是指针,所以需要使用*person3来访问结构体的属性
	//创建结构体的方法4
	person4 := &model.Person{
		Name: "赵六",
		Age:  21,
	} //使用&符号创建结构体,返回的是结构体的指针
 	fmt.Println("person4=", *person4) //person4是指针,所以需要使用*person4来访问结构体的属性
}
  • 第三种和第四种方式返回的是结构体的指针。
  • 结构体指针访问字段的标准格式是:(结构体指针名).属性名,比如 (person3).Name = "王五"。
  • go的设计者为了简化代码,提供了这种简写形式,比如 person3.Name = "王五"也可以。go的编译器对person3.Name做了转化为(*person3).Name。

标签:Name,Age,cat,person3,go,model,结构,struct
From: https://www.cnblogs.com/mafu-blogs/p/18010724

相关文章

  • 深入浅出Go语言:泛型入门指南
    深入浅出Go语言:泛型入门指南原创 麻凡 麻凡 2024-03-0109:00 湖南 听全文随着Go1.18版本的发布,泛型正式成为了Go语言的一部分。泛型为Go开发者带来了更强大的类型抽象能力,允许我们编写更加灵活和可复用的代码。本文将带你了解Go泛型的基础知识,让你快速上手这一新特......
  • hbase结构简介
    Hbase结构图hmaster负责给regionserver分配region,region处理具体的数据存储和查找,zk是一个注册中心,hmaster通过zk感知regionserver存活与否。客户端是通过zk取到hmater的位置,然后取到位于namespace下面的mate表里面的region分区信息才能知道对应得rowkey应该去哪里取得。Hba......
  • 为什么django3+版本不能用sql_server.pyodbc只能用mssql
    之前使用的是django2.2.2,后来换到django3.2后发现在settings中进行数据库链接sqlserver的时候sql_server.pyodbc用不了,随后切换到mssql才行,后来查阅后发现是版本问题导致 Django3.2本身不包含对SQLServer的直接支持。默认情况下,Django支持几种主流的数据库后端,例如SQLi......
  • 解决celery与django结合后,分别启动celery和django的进程同时调用定时任务的问题
     django中引入celery后发现在代码中写如下这样的定时任务,启动celery和django的工程后,他们都会调用这个定时任务导致,任务有的时候会冲突出现奇怪的问题。如何解决请继续看。scheduler=BackgroundScheduler()scheduler.add_job(testFunc,'interval',seconds=60)scheduler.......
  • Go语言精进之路读书笔记第41条——有层次地组织测试代码
    聚焦位于测试包内的测试代码该如何组织41.1经典模式—平铺测试函数各自独立,测试函数之间没有层级关系,所有测试平铺在顶层41.2Unit家族模式测试套件(TestSuite)和测试用例(TestCase)41.3测试固件测试固件是一个人造的、确定性的缓解,在这个环境中进行测试,测试结果是可重复的......
  • MongoDB 聚合
    MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的count(*)。aggregate()方法MongoDB中聚合的方法使用​aggregate()​。语法​aggregate()​方法的基本语法格式如下所示:>db.COLLECTION_NAME.aggregate(AGGR......
  • MongoDB 索引
    索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是特殊的数据结构,索引存......
  • vminsert 依赖之GoGoProtos
      publicfinalclassGoGoProtos{privateGoGoProtos(){}publicstaticvoidregisterAllExtensions(com.google.protobuf.ExtensionRegistryLiteregistry){registry.add(GoGoProtos.goprotoEnumPrefix);registry.add(GoGoProtos.......
  • golang wire依赖注入
    安装gogetgithub.com/google/wire/cmd/wire@latest一.假设需要定义多个有依赖的启动项,新建main.gopackagemainimport("fmt")typeMessagestringfuncNewMessage()Message{returnMessage("Hithere!")}typeEventstruct{GreeterGreeter}......
  • go: 协程生命周期控制
    go:协程生命周期控制原创 王义杰 运维开发王义杰 2024-02-2822:27 广东 听全文在go开发中,如果我们希望在一定条件下,比如执行了某些任务后,主动结束其它相关的协程,可以通过使用context包来实现。context包允许我们发送取消信号给一个或多个协程,这样我们就可以控制协......