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

    大家好,我们是链客区块链技术问答社区,今天讲一讲Go语言的基础编程。

    链客,有问必答!!!

1 结构体类型

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

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

2 结构体初始化

2.1 普通变量

type Student struct {

id   int

name string

sex  byte

age  int

addr 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   int

name string

sex  byte

age  int

addr 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 = sz

fmt.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 Student

s2.id = 2

s2.name = "yoyo"

s2.sex = ‘f‘

s2.age = 16

s2.addr = "guangzhou"

fmt.Println(s2) //{2 yoyo 102 16 guangzhou}

3.2 指针变量

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

//3、先分配空间,再赋值

s3 := new(Student)

s3.id = 3

s3.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 true

fmt.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   int

Name string

}

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

Id   int

name 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)

}

原文地址:https://www.cnblogs.com/liankexing/p/10287218.html

时间: 2024-12-31 07:25:51

GO语言编程基础-复合类型结构体的相关文章

C语言中的系统时间结构体类型

在C语言涉及中经常需要定时触发事件,涉及到获取系统时间,其结构体类型有多种.Unix/Linux系统下有以下几种时间结构: 1.time_t 类型:长整型,一般用来表示从1970-01-01 00:00:00时以来的秒数,精确度:秒:由函数time()获取: 该类型定义在头文件 /usr/include/sys/time.h 中: #define _TIME_T       typedef   long   time_t;             #endif 函数定义:time_t   tim

LINUX下C语言编程基础

实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理及语法规范 7. 掌握静态库和动态库的生成 二.实验步骤 1. 快捷键 Ubuntu中: 2. vim VIM是一个非常好的文本编辑器,很多专业程序员使用VIM编辑代码,即使以后你不编写程序,只要跟文本打交道,都应该学学VIM,可以浏览参考一下普通人

同类型结构体之间赋值不一定有效

同类型结构体之间赋值不一定有效 今天为这个问题debug好久... 之前看到一个关于结构体使用的技巧, 这个技巧能够避免内存零碎. 保证结构体所属内存尽量不要零散化. struct struct_name { element_type varible; ...; element_type  pointer[0]; } 关于该用法的介绍. http://blog.csdn.net/cinmyheart/article/details/28985843 对于普通的结构体, struct num {

编程题:对结构体变量中成员的引用展示。

编程题:对结构体变量中成员的引用展示. #include<stdio.h> void main() { struct person { char name[20]; char sex; struct date {int year; int month; int day; }birthday; float height; }per; printf("Enter the name:"); gets(per.name);per.sex='M'; per.birthday.year

黑马程序员---C基础12【结构体数组】【结构体指针】【结构体嵌套】【作为函数参数】【枚举类型】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [结构体数组] 1.结构体数组: 结构体数组的每一个元素都是具有相同结构类型的下标结构变量:(可以表示一个群体,一个班学生档案) 2.结构数组定义: 定义格式: struct    结构名{ 成员列表: }数组名[数组长度]: 1 1)定义结构体的同时定义数组: 2 3 struct stu{ 4 5 int num; 6 7 char name[10]; 8 9 int age; 10 11

零基础入门之结构体字节对齐

一.字节对齐的规则: 1.一般设置的对齐方式为1,2,4字节对齐方式.结构的首地址必须是结构内最宽类型的整数倍地址:另外,结构体的每一个成员起始地址必须是自身类型大小的整数倍(需要特别注意的是windows下是这样的,但在linux的gcc编译器下最高为4字节对齐),否则在前一类型后补0:这里特别提到的是数组一定要注意,而且在一些编程的技巧中,我们可以使用数组强制字节达到对齐的目的.这在网络编程中是很常见的. 举例:比如CHAR型占用空间为1字节,则其起始位置必须可被1整除.INT为4字节,其起

C语言--&gt;(十四)结构体、宏、编译

知识点: 1.结构体 struct 2.typedef关键字 3.宏的定义 4.宏与函数的区别 5.文件包含和多文件编译 6.条件编译 ===========================结构体 思考:如果现在希望保存一个学生的信息,姓名,身高,年龄,地址,该如何保存 char name[64]; float height; int age; char addr[64]; 1.什么是结构体 struct 结构体指的是一种数据结构,是c语言中复合数据类型的一 种多种不同数据类型的集合 2.结构体

「C语言」「例题」结构体与共用体

本篇收集<C语言程序设计教程>第九章“结构体与共用体”的所有例题. 1 #include <stdio.h> 2 3 /*输入一个学生的基本信息, 4 包括学号.姓名.性别.年龄.出生日期.三门成绩, 5 输出该学生的基本信息和平均成绩*/ 6 7 struct date 8 { 9 int year;/* 年份 */ 10 int month;/* 月份 */ 11 int day; /* 日期 */ 12 }; 13 14 struct student 15 { 16 char

c语言_文件操作_FILE结构体小解释

参考文档来自:https://www.cnblogs.com/haore147/p/3648395.html 我们通过fopen返回一个文件指针(指向FILE结构体的指针)来进行文件操作. 在vs2013下的代码如下: #include <stdio.h> #pragma warning(disable:4996) int main() { FILE *p = fopen("C:\\test\\win\\a.txt", "r"); char buf[10