GO语言编程基础-复合类型结构体

news/2024/7/7 18:43:16

链客,专为开发者而生,有问必答!

此文章来自区块链技术社区,未经允许拒绝转载。

在这里插入图片描述
1 结构体类型

有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性。显然单独定义以上变量比较繁琐,数据不便于管理。

结构体是一种聚合的数据类型,它是由一系列具有相同类型或不同类型的数据构成的数据集合。每个数据称为结构体的成员。

2 结构体初始化

2.1 普通变量

type Student struct {

id   intname stringsex  byteage  intaddr string

}

func main() {

//1、顺序初始化,必须每个成员都初始化var s1 Student = Student{1, "mike", 'm', 18, "sz"}s2 := Student{2, "yoyo", 'f', 20, "sz"}//s3 := Student{2, "tom", 'm', 20} //err, too few values in struct initializer//2、指定初始化某个成员,没有初始化的成员为零值s4 := Student{id: 2, name: "lily"}

}

2.2 指针变量

type Student struct {

id   intname stringsex  byteage  intaddr string

}

func main() {

var s5 *Student = &Student{3, "xiaoming", 'm', 16, "bj"}s6 := &Student{4, "rocco", 'm', 3, "sh"}

}

3 结构体成员的使用

3.1 普通变量

//===============结构体变量为普通变量

//1、打印成员var s1 Student = Student{1, "mike", 'm', 18, "sz"}//结果:id = 1, name = mike, sex = m, age = 18, addr = szfmt.Printf("id = %d, name = %s, sex = %c, age = %d, addr = %s\n", s1.id, s1.name, s1.sex, s1.age, s1.addr)//2、成员变量赋值var s2 Students2.id = 2s2.name = "yoyo"s2.sex = 'f's2.age = 16s2.addr = "guangzhou"fmt.Println(s2) //{2 yoyo 102 16 guangzhou}

3.2 指针变量

//===============结构体变量为指针变量

//3、先分配空间,再赋值s3 := new(Student)s3.id = 3s3.name = "xxx"fmt.Println(s3) //&{3 xxx 0 0 }//4、普通变量和指针变量类型打印var s4 Student = Student{4, "yyy", 'm', 18, "sz"}fmt.Printf("s4 = %v, &s4 = %v\n", s4, &s4) //s4 = {4 yyy 109 18 sz}, &s4 = &{4 yyy 109 18 sz}var p *Student = &s4//p.成员 和(*p).成员 操作是等价的p.id = 5(*p).name = "zzz"fmt.Println(p, *p, s4) //&{5 zzz 109 18 sz} {5 zzz 109 18 sz} {5 zzz 109 18 sz}

4 结构体比较

如果结构体的全部成员都是可以比较的,那么结构体也是可以比较的,那样的话两个结构体将可以使用== 或 != 运算符进行比较,但不支持 > 或 < 。

func main() {

s1 := Student{1, "mike", 'm', 18, "sz"}s2 := Student{1, "mike", 'm', 18, "sz"}fmt.Println("s1 == s2", s1 == s2) //s1 == s2 truefmt.Println("s1 != s2", s1 != s2) //s1 != s2 false

}

5 结构体作为函数参数

5.1 值传递

func printStudentValue(tmp Student) {

tmp.id = 250//printStudentValue tmp =  {250 mike 109 18 sz}fmt.Println("printStudentValue tmp = ", tmp)

}

func main() {var s Student = Student{1, “mike”, ‘m’, 18, “sz”}

printStudentValue(s)        //值传递,形参的修改不会影响到实参fmt.Println("main s = ", s) //main s =  {1 mike 109 18 sz}

}

5.2 引用传递

func printStudentPointer(p *Student) {

p.id = 250//printStudentPointer p =  &{250 mike 109 18 sz}fmt.Println("printStudentPointer p = ", p)

}

func main() {

var s Student = Student{1, "mike", 'm', 18, "sz"}printStudentPointer(&s)     //引用(地址)传递,形参的修改会影响到实参fmt.Println("main s = ", s) //main s =  {250 mike 109 18 sz}

}

6 可见性

Go语言对关键字的增加非常吝啬,其中没有private、 protected、 public这样的关键字。

要使某个符号对其他包(package)可见(即可以访问),需要将该符号定义为以大写字母开头。

目录结构:

test.go示例代码如下:

//test.gopackage test

//student01只能在本文件件引用,因为首字母小写type student01 struct {

Id   intName string

}

//Student02可以在任意文件引用,因为首字母大写type Student02 struct {

Id   intname string

}

main.go示例代码如下:

// main.gopackage main

import (

"fmt""test" //导入test包

)

func main() {

//s1 := test.student01{1, "mike"} //err, cannot refer to unexported name test.student01//err, implicit assignment of unexported field 'name' in test.Student02 literal//s2 := test.Student02{2, "yoyo"}//fmt.Println(s2)var s3 test.Student02 //声明变量s3.Id = 1             //ok//s3.name = "mike"  //err, s3.name undefined (cannot refer to unexported field or method name)fmt.Println(s3)

}


http://lihuaxi.xjx100.cn/news/237312.html

相关文章

【C语言】学习笔记3——字符串

1. 字符串&#xff08;charcacter string&#xff09;是一个或多个字符的序列 2. C语言没有专门用于存储字符串的变量类型。字符串都被存储在char类型的数组种。 3. 数组由连续的存储单元组成&#xff0c;字符串种的字符被存储在相邻的存储单元中&#xff0c; 每个单元存储一个…

redux rxjs_可观察的RxJS和Redux入门指南

redux rxjsRedux-Observable is an RxJS-based middleware for Redux that allows developers to work with async actions. Its an alternative to redux-thunk and redux-saga.Redux-Observable是Redux的基于RxJS的中间件&#xff0c;允许开发人员使用异步操作。 它是redux-t…

以太坊系统账户

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 在以太坊系统中&#xff0c;状态是由被称为“账户”&#xff08;每个账户由一个20字节的地址&#xff09;的对象和在两个账户之间转移价值和信息的状…

c# 持续集成 单元测试_如何在不进行单元测试的情况下设置持续集成

c# 持续集成 单元测试Do you think continuous integration is not for you because you have no automated tests? Or no unit tests at all? Not true. Tests are important. But there are many more aspects to continuous integration than just testing. Lets see what…

[20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt

[20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt--//简单探究12c TABLE ACCESS BY INDEX ROWID BATCHED特性.--//当使用12c时,执行计划出现TABLE ACCESS BY INDEX ROWID BATCHED,做一些探究.--//本文主要探究如何使用提示或者隐含参数控制这种特性.1.环境:SCOTTtest01…

解析equals(Object obj)和compareTo(T obj)

背景&#xff1a;最近在研究静态扫描的东西&#xff0c;遇到一个规则&#xff1a;"equals(Object obj)" should be overridden along with the "compareTo(T obj)" method 然后就想深度扒一扒equals和compareTo有什么区别 1.java.lang.Object是所有类的父类…

区块链技术名词简介

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 零知识证明 零知识证明指证明者能在不向验证者提供任何有用的信息下&#xff0c;使验证者相信某个论断是正确的。零知识证明实质是一种涉及两方或更…

RPC-原理及RPC实例分析

还有就是&#xff1a;RPC支持的BIO,NIO的理解 (1)BIO: Blocking IO;同步阻塞&#xff1b; (2)NIO:Non-Blocking IO&#xff0c; 同步非阻塞; 参考&#xff1a;IO多路复用,同步&#xff0c;异步&#xff0c;阻塞和非阻塞 区别 在学校期间大家都写过不少程序&#xff0c;比如写个…