厚土Go学习笔记 | 17. 结构体及用指针访问结构体

结构体是个很有用的东西,在用计算机语言描述现实世界里的东西时,不得不大量的使用它。把现实世界的某一样东西的各种属性,用一个一个的变量记录下来。

最简单的比如:平面坐标 平面坐标有两个值,X和Y

在go语言中可以这样定义一个坐标的结构体

type Coodinate struct{
    X int
    Y int
}

由于定义一个结构体是为了各种地方都能够调用,甚至外部调用。所以,无论是结构体的命名,还是结构体结构内部的组成元素都是首字母大写。(go语言一个简单的规则,大写首字母可供外部调用,小写首字母只在一定范围内调用。)

下面简单打印一下这个坐标结构体吧。

package main

import (
    "fmt"
)
type Coodinate struct{
    X int
    Y int
}
func main() {
    fmt.Println(Coodinate{5, 10})
}

打印的结果也与一般的输出不同,结构体的输出是带有 { } 符号的。

{5 10}

结构提里的组成元素,称之为“字段”,可以使用符号 “.” 来访问。

Co := Coodinate{15, 20}
Co.X = 1973

上面的代码,初始化了一个结构体,又修改了其中X的值。

把刚才完整代码改一下

package main

import (
    "fmt"
)
type Coodinate struct{
    X int
    Y int
}
func main() {
    fmt.Println(Coodinate{5, 10})
    Co := Coodinate{15, 20}    //声明一个变量Co为结构体类型,并初始化。
    fmt.Println(Co)
    Co.X = 1973        //修改变量结构体的字段X值
    fmt.Println(Co)
}

运行结果是这样的

{5 10}
{15 20}
{1973 20}

可以看到,在代码中,既能够直接使用结构体,又可以声明一个变量为结构体。然后对变量进行操作,例如修改变量结构体里的某个字段。

还记得指针吗?指针重点你要知道是利用内存地址来操作数据。变量是结构体类型,一样有内存地址。取地址方法是变量前加 & 符号

&Co

下面看看用指针如何修改一个变量结构体的。

package main

import (
    "fmt"
)
type Coodinate struct{
    X int
    Y int
}
func main() {
    fmt.Println(Coodinate{5, 10})
    Co := Coodinate{15, 20}     //声明一个变量Co为结构体类型,并初始化。
    fmt.Println(Co)
    Co.X = 1973                 //修改变量结构体的字段X值
    fmt.Println(Co)

    //下面用指针访问结构体
    p := &Co
    p.X = 1975
    p.Y = 45
    fmt.Println("Pointer control result is", Co)
}

运行结果是这样的

{5 10}
{15 20}
{1973 20}
Pointer control result is {1975 45}

通过指针间接的访问是透明的。

结构体初始化的时候,不是必须给结构体内所有的字段都做初始化的。没有初始化的字段,会根据字段类型取它自己的零值(默认值)。方法如下

package main

import (
    "fmt"
)
type Coodinate struct{
    X int
    Y int
}
var(
    Co1 = Coodinate{73, 45}
    Co2 = Coodinate{X:75}
    Co3 = Coodinate{}
    p = &Coodinate{9, 17}
)
func main() {
    //结构体的初始化赋值
    fmt.Println(Co1, Co2, Co3, p, *p)
}

运行结果是这样的

{73 45} {75 0} {0 0} &{9 17} {9 17}

注意看 p*p 的不同结果。p 返回的结果有一个特殊的前缀 &,是指向结构体的指针。 打印指针需要在变量前加 * 符号。所以是 *p

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2017-12-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java学习

java每日一练(2017/9/16)

本期题目 (单选题) 1、代码String str=”123456a”;int i=Integer.parseInt(str);会报异常的是() A java...

3818
来自专栏LEo的网络日志

c库函数strncat出现乱字符

3897
来自专栏CSDN技术头条

12个非常有用的JavaScript技巧

在这篇文章中,我将分享12个非常有用的JavaScript技巧。这些技巧可以帮助你减少并优化代码。 1) 使用!!将变量转换成布尔类型 有时,我们需要检查一些变...

2176
来自专栏鸿的学习笔记

Python漫谈

列表切片的标准是lst[a:b:c] a是列表切片的开头,b是切片的结尾,c是step。 这里的表示从第一个元素开始,按照每隔一步,到第三个元素结束

1023
来自专栏运维小白

9.4sed(上)

sed工具 sed -n '5'p test.txt sed -n '1,5'p test.txt sed -n '1,$'p test.txt sed -n ...

1868
来自专栏青玉伏案

窥探Swift之函数与闭包的应用实例

今天的博客算是比较基础的,还是那句话,基础这东西在什么时候都是最重要的。说到函数,只要是写过程序就肯定知道函数是怎么回事,今天就来讨论一下Swift中的函数的特...

2005
来自专栏Golang语言社区

厚土Go学习笔记 | 09. 类型转换 与 类型推导

在Go语言中,不同类型的项之间赋值时,需要显式转换。 表达式 T(v) 将值 v 转换为类型 T 。 var i int = 42 var f float64 ...

36110
来自专栏finleyMa

说下js中的bind

bind的受体是对象,返回的是个新的函数。 我们知道this总是指向调用他的对象。但是有时候我们希望‘固化’这个this。 也就是无论怎么调用这个返回的函数...

6631
来自专栏文武兼修ing——机器学习与IC设计

JavaScript入门笔记(2)字符串相关列表对象

字符串相关 字符串基础 字符串历来是各种编程语言坑最多的地方(个人认为),不同软件语言在字符串上的操作的差别比软件语言和硬件描述语言的差距都大(一样是个人认为)...

3196
来自专栏python3

python3--元组(tuple),列表(list),字典dict,其它(for,enumerate,range)

元组被称为只读列表,即数据可以被查询,但不能被修改,所以,字符串的切片操作同样适用于元组

2431

扫码关注云+社区

领取腾讯云代金券