Go 语言结构体

Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
 
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
 
结构体表示一项记录,比如保存图书馆的书籍记录,每本书有以下属性:
 
Title :标题
Author : 作者
Subject:学科
ID:书籍ID
 
定义结构体
结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体有中有一个或多个成员。type 语句设定了结构体的名称。
 
 
语法:
type struct_variable_type struct {
member definition;
member definition;
...
member definition;
}

  

 
//例子:
type Books struct {
title string
author string
subject string
book_id int
}

  

 
那么就可以使用如下的定义方式:
variable_name := structure_variable_type {value1, value2...valuen}
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}

  

// 例子:
var book1 = Books {"Go 入门到放弃","yuantiankai","go系列教程",012231}

  

 
访问结构体成员
如果要访问结构体成员,需要使用点号 . 操作符,格式为:
结构体.成员名
 
//例子:
fmt.Println(book1.author)
fmt.Println(book1.title)

  

结构体作为函数参数

你可以像其他数据类型一样将结构体类型作为参数传递给函数。并以以上实例的方式访问结构体变量:
//例子:
func printBook( book Books ) {
fmt.Printf( "Book title : %s\n", book.title);
fmt.Printf( "Book author : %s\n", book.author);
fmt.Printf( "Book subject : %s\n", book.subject);
fmt.Printf( "Book book_id : %d\n", book.book_id);
}
然后这个printBook函数可以在主函数中调用。
 

 

结构体指针

你可以定义指向结构体的指针类似于其他指针变量,格式如下:

var struct_pointer *Books

  

以上定义的指针变量可以存储结构体变量的地址。查看结构体变量地址,可以将 & 符号放置于结构体变量前:
 
struct_pointer = &Book1;

  

 
使用结构体指针访问结构体成员,使用 "." 操作符:
struct_pointer.title;:
 
//例子:
var b *Books b = &Book1
fmt.Println(b) //&{Go 语言 www.runoob.com Go 语言教程 6495407}
fmt.Println(*b) //{Go 语言 www.runoob.com Go 语言教程 6495407}
fmt.Println(&b) //0xc000082018
fmt.Println(Book1) //{Go 语言 www.runoob.com Go 语言教程 6495407}

  

 
//解释:
其实跟普通的指针是一样的,只不过这次是指定的结构体的指针,在上面的例子中:
var b *Books     //就是说b这个指针是Books类型的。
b  = &Book1     //Book1是Books的一个实例化的结构,&Book1就是把这个结构体的内存地址赋给了b,
*b         //那么在使用的时候,只要在b的前面加个*号,就可以把b这个内存地址对应的值给取出来了
&b        // 就是取了b这个指针的内存地址,也就是b这个指针是放在内存空间的什么地方的。
Book1       // 就是Book1这个结构体,打印出来就是它自己。也就是指针b前面带了*号的效果。
 
 
//只有一个特殊的地方,尽管b所表示的是Book1对象的内存地址,但是,在从b对应的内存地址取属性值的时候,就不是*b.title了。而是直接使用b.title,这点很特殊,它的效果就相当于Book1.title:
fmt.Println(b.title)   //Go 入门到放弃
fmt.Println(Book1.title)   //Go 入门到放弃
fmt.Println(b.author)   //yuantiankai
fmt.Println(Book1.author)  //yuantiankai
 

具体区别:
比如我们要写一个函数修改结构体里的一个值,那么我们需要将修改过后的值返回出来,然后再重新赋值,比如这样:
package main

import "fmt"

type Books struct {
title string
author string
subject string
book_id int
} func changeBook(book Books) string { //把book对象传进来,返回的值是string类型的,也就是将被修改的值返回出来。
book.title = "book1_change"
return book.title
} func main() {
var book1 Books;
book1.title = "book1"
book1.author = "zuozhe"
book1.book_id = 1
var res = changeBook(book1) //然后在外面拿到被修改的值
book1.title = res // 再重新赋值
fmt.Println(book1)
}
//结果为:
{book1_change zuozhe 1}

  

 
如果我们这样做,是行不通的,看如下代码:
package main

import "fmt"

type Books struct {
title string
author string
subject string
book_id int
} func changeBook(book Books) { //这个函数没有返回值
book.title = "book1_change" //仅仅是修改了一下
} func main() {
var book1 Books;
book1.title = "book1"
book1.author = "zuozhe"
book1.book_id = 1
changeBook(book1) //将book1传进去,本意是想修改book1里面的值
fmt.Println(book1)
}
//结果为: {book1 zuozhe 1} // 但是结果现实并没有任何修改。

 

但是有了结构体指针,就不是值传递了,而是引用传递(传递的是地址)了。就可以这么写了:
package main

import "fmt"

type Books struct {
title string
author string
subject string
book_id int
} func changeBook(book *Books) { // 这个方法传入的参数一个Books类型的指针
book.title = "book1_change" //直接用指针.属性的方式,修改原地址的值。
} func main() {
var book1 Books;
book1.title = "book1"
book1.author = "zuozhe"
book1.book_id = 1
changeBook(&book1) //将book1这个对象的内存地址传进去,
fmt.Println(book1)
}
//结果为: {book1_change zuozhe 1} //成功修改了book1的值

  

 
 
 
 

go语言的结构体指针的更多相关文章

  1. go语言初始化结构体指针

    go语言初始化结构体指针 head:=&ListNode{} 或者 head:=new(ListNode)

  2. c语言中结构体指针

    1.指向结构体的指针变量: C 语言中->是一个总体,它是用于指向结构体,如果我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体.那么我们要用指针取出结构体中的数据.就要用到指向运 ...

  3. C语言定义结构体指针数组并初始化;里面全是结构体的地址

    #include <stdio.h> #include <string.h> struct tells;//声明结构体 struct info { char *infos; } ...

  4. 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct

    https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...

  5. 【C语言入门教程】7.3 结构体指针的定义和引用

    C 语言中指针的操作非常灵活,它也能指向结构体变量对结构体变量进行操作.在学习结构指针之前,需要再次加深对指针的认识.声明指针变量时所使用的数据类型修饰符实际上的作用是定义指针访问内存的范围,如果指针 ...

  6. c语言结构体指针初始化

    今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...

  7. c语言中的结构体指针类型的cast

    1.我们在c语言中会经常碰到强制类型转换. 在这,我介绍一种结构pointer类型转换,但是有前提(有点类似于c++中的继承中的子父对象的cast). 简单的介绍一下: 首先我们要知道一个结构的指针, ...

  8. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  9. C语言_了解下结构体指针

    在C语言中几乎可以创建指向任何类型的指针,包括用户自定义的类型.当然也可以指向结构体,先看一个小案例: #include <stdio.h> #include <string.h&g ...

随机推荐

  1. maven 远程仓库、私服及镜像配置

    maven仓库分类 本地仓库.远程仓库.远程仓库又有私服.中央仓库.其它公共库.中央仓库是maven自带的核心仓库. 仓库配置远程仓库可以配置多个,超级pom中定义的中央仓库 <reposito ...

  2. PSP软件开发过程

    1. 引言 这是为了编写psp系统的软件需求分析,主要按照提供的相关需求和功能. 1.1 项目风险 风险承担者包括: 任务提出者:承担任务不能完全按照想象的做出,投入等: 软件开发者:可能不能按时交付 ...

  3. 第一章:了解SQL_数据库基础

    什么是数据库(database): 数据库(database)是保存有组织的数据的容器(通常是一个文件或一组文件).数据库是一种以某种有组织的方式存储的数据集合.   表(table): 表(tabl ...

  4. MVC 在视图中获取当前的Controller、Action的方式

    在视图中获取Controller和Action的方式: Controller: @ViewContext.RouteData.Route.GetRouteData(this.Context).Valu ...

  5. jenkins + k8s + lnp

    前提条件: K8S 已部署好,traefik也部署完成 K8S 集群上都挂载NFS盘,防止jenkins挂掉后配置消失 基础镜像使用 lnp,PHP 5.6.31  nginx/1.8.1  基础镜像 ...

  6. SDN 第一次作业

    你会选择作 网络编程 方向的程序员吗?为什么? 答: 可能会选择吧.看了那篇文章感觉网络编程的程序员和其他的程序员都并不简单,网络编程的程序员可能更要对网络的知识更加了解.我现在也有机会能接触网络方向 ...

  7. chrome开发者工具那点事

    Elements:查找网页源代码HTML中的任一元素,手动修改任一元素的属性和样式且能实时在浏览器里面得到反馈. Console:记录开发者开发过程中的日志信息,且可以作为与JS进行交互的命令行She ...

  8. 理解活在Iphone中的那些App (二)

    app是什么,为什么而存在 存在即合理的说法,已经被批臭批烂了.所以,作为一个程序员不能简简单单的因为上面来了一个需求,就完成一个需求.让做一个app就做一个app,只是简单的认为存在即合理,头让写就 ...

  9. 对于socket发送数据时是否要加锁及write read的阻塞非阻塞

    偶尔讨论到了socket发送数据时是否应该加锁的问题,就在网上查了一下,下面是大神陈硕的答案 对于 UDP,多线程读写同一个 socket 不用加锁,不过更好的做法是每个线程有自己的 socket,避 ...

  10. 【LGP4886 】快递员

    题目 好秒啊,真是一道神仙的点分治 于是我们来一个暴力的\(O(nlog^2n)\)的暴力统计吧 考虑计算每一个点作为快递中心时的答案 我们考虑在这个点成为分治重心时计算这个贡献 把这个贡献分成两部分 ...