首页 > 其他分享 >go语言结构体

go语言结构体

时间:2023-07-03 14:33:54浏览次数:37  
标签:p2 p3 语言 %+ fmt User Printf go 结构

结构体

Go语言的结构体有点像面向对象语言中的“类”,但不完全是,Go语言也没打算真正实现面向对象范式。

定义

使用type定义结构体,可以把结构体看做类型使用。必须指定结构体的字段(属性)名称和类型。

type User struct {
 id         int
 name, addr string // 多个字段类型相同可以合写
 score      float32
}

User不过是个标识符,是一个指代罢了 真正的类型定义是struct {} 的部分

初始化

type User struct {
 id         int
 name, addr string
 score float32
}
// 1 var声明,非常常用
var u1 User // 这种方式声明结构体变量很方便,所有字段都是零值
fmt.Println(u1)
fmt.Printf("%+v\n", u1) // 加上字段打印
fmt.Printf("%#v\n", u1) // 加上更多信息打印
// 2 字面量初始化,推荐
u2 := User{} // 字段为零值
fmt.Printf("%#v\n", u2)
// 3 字面量初始化,field: value为字段赋值
u3 := User{id: 100}
fmt.Printf("%+v\n", u3)
u4 := User{
 id: 102, score: 95.8,
 addr: "Nanjing", name: "Tom",
} // 名称对应无所谓顺序
u5 := User{103, "John", "Beijing", 98.5} // 无字段名称必须按照顺序给出全部字段值
fmt.Printf("%+v\n", u4)
fmt.Printf("%+v\n", u5)
initial

 可见性

Go包的顶层代码中,首字母大写的标识符,跨package包可见(导出),否则只能本包内可见

导出的结构体,package内外皆可见,同时,导出的结构体中的成员(属性、方法)要在包外也可见,则也需首字母大写

 查询和修改

可以使用字段名称访问和修改

 成员方法

利用下面形式为结构体组合方法,这是很方便自由地扩展方式。

type User struct {
 id         int
 name, addr string
 score      float32
}
// u称为receiver
// 等价于 func (User) string
func (u User) getName() string {
 return u.name
}
func main() {
 u1 := User{103, "John", "Beijing", 98.5}
 fmt.Println(u1.getName())
}

非引用类型

结构体是非引用类型,和数组一样,使用的是值拷贝。传参或返回值如果使用结构体实例,将产生很多副本。如何避免过多副本,如何保证函数内外使用的是同一个结构体实例呢?使用指针。

 
func test(p *Point) *Point {
    p.x = 20
    p.y = 30
    return p
}

type Point struct {
    x, y int
}

func main {
    p0 := Point{1, 2}
    fmt.Printf("%+v %[1]T %p\n", p0, &p0)
    p1 := p0 // 值拷贝类型
    fmt.Printf("%+v %[1]T %p\n", p1, &p1)
    p2 := &p0 // 引用指针来赋值,引用类型
    fmt.Printf("%+v %[1]T %p\n", p2, p2)
    p3 := test(p2)
    fmt.Printf("%+v %[1]T %p\n", p2, p2)
    fmt.Printf("%+v %[1]T %p\n", p3, p3)
    p3.x = 100 // 通过指针修改字段的值
    fmt.Printf("%+v %[1]T %p\n", p2, p2)
    fmt.Printf("%+v %[1]T %p\n", p3, p3)
    p4 := new(User) // 用new来生成一个新的零值实例
    fmt.Printf("%+v %[1]T %p\n", p4, p4)
}

 

                                         

标签:p2,p3,语言,%+,fmt,User,Printf,go,结构
From: https://www.cnblogs.com/caibao666/p/17508094.html

相关文章

  • 计算机体系结构习题
    例题1.2例题1.3习题1.6习题1.8(第二版)  例题3.1例题3.2 ......
  • 第1章 计算机系统结构的概念
    1.计算机体系结构的经典定义计算机体系结构是程序员所看到的计算机的属性,即计算机的逻辑结构和功能特征2.常见的计算机系统结构分类法⑴冯氏分类法——依据:按照系统的最大并行度⑵Flynn分类法——依据:按照指令流和数据流的多重性4个具体分类:单指令流单数据流-单指令流多......
  • C语言(1)
    目录1.数据类型1.1基本类型1.2构造类型1.3指针类型1.4空类型(void)2.变量和常量2.1C语言中常量的表示方式2.2数据在内存中的存储2.3C语言中变量的表示方式2.3.1变量的定义2.3.2变量的含义3.整数之间的赋值问题3.1长的赋值给短的3.2短的赋值给长的4.运算符与表达式4.1运算符的分类4.2......
  • C语言(二)
    目录6.数组6.1数组的概念6.2一维数组6.3排序问题6.3.1插入排序6.3.2冒泡排序6.3.3选择排序6.4二分查找6.5字符数组6.6二维数组6.数组6.1数组的概念一组具有相同类型,相同含义的数据类型的有序集合。数组不是基本类型,是构造类型。数组的本质/数组的存储方式:一片地址连续的空间......
  • 开发中MongoDB遇到的各种问题
    目录一、安装6版本以下二、安装6版本及以上三、安装6版本以下(解压版)四、配置本地WindowsMongoGB服务五、navicat连接远程mongodb数据库六、ip不一致问题一、安装6版本以下安装MongoDB6版本以下的可以参考以下博主->自动安装版(26条消息)MongoDB安装(超详细)_AIbro的博客-C......
  • 在JAVA中使用mongoTemplate构造查询条件
    //创建条件对象Criteriacriteria=newCriteria();//3.单个条件查询多个字段(客户编号)if(StringUtils.isNotEmpty(bo.getAdmpId())){criteria.orOperator(Criteria.where("final_uid").is(bo.getAdmpId()),Criteria.where("customer_......
  • 【PHP语言】医院安全(不良)事件报告系统
    技术架构:前后端分离,仓储模式,开发语言:PHP开发工具:vscode前端框架:vue2+element后端框架:laravel8数据库:mysql5.7系统概述:医院安全(不良)事件报告系统是一种用于医院管理和监管的工具,旨在帮助医疗机构识别、跟踪、分析和解决各种医疗安全事件,提高医疗质量和患者安全。医院安全(......
  • vue+elementui实现树形结构表格且合并同一个children的单元格
    1、实现效果2、结构代码(给table添加classname)3、通过设置css实现合并同一个children的单元格.nonRelationalDatabase{//去除横向边框::v-deep.el-table__row{  td{   border-bottom:none!important;  } }//......
  • mysql的表结构导出成word文档
     pararent的pow.xml<properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourc......
  • 如何在Django中创建一个简单的计算器应用程序
    Django是一个免费开源的PythonWeb框架,可帮助您快速开发安全且可维护的Web应用程序。在本教程中,我将逐步指导您使用django创建计算器应用程序。这是一个适合初学者的教程,因此如果您是Django新手,可以继续学习。(更|多优质内|容:java567点c0m) 我们的计算器应用程序会......