go 类型断言_Go语言学习基础-指针、结构体、方法、接口、错误

Pointer指针

Go支持指针,可以在程序中传递值或值的引用。

下面的示例通过两个函数来展示指针的使用方式:zeroval和zeroptr。函数zeroval有一个int参数,因此参数将按值传递给它。zeroval将从调用函数中得到一个传递进来的值的副本ival。函数zeroptr则有一个*int参数,这意味着它接受一个int指针。

函数体中解指针语法*ipt从其内存地址中得到该地址的当前值。为解指针赋值将更改该地址的值。取指针语法&i获得变量i的内存地址,也叫i的指针。指针也可以打印。zeroval不会更改main函数中i的值,但zeroptr会,这是因为它引用了该变量的内存地址,通过变量的地址改变了变量的内容。

96ab443621a5dd63b66dbf9ca4c5d846.png

结果:

$ go run pointers.go

initial: 1

zeroval: 1

zeroptr: 0

pointer: 0x42131100

Struct结构体

Go的结构是字段的类型集。它们用于将数据分组形成记录。

下面例子中,person结构类型具有名字和年龄字段。函数NewPerson则使用给定的名字构造person结构的实例,并把该实例的指针安全地返回给局部变量,局部变量将在声明它的函数的作用域内生存。可以在初始化结构时指定字段名,省略的字段将为零值。取指符&生成指向该结构的指针。习惯上,封装一个构造函数用于创建结构实例。通过点符号.访问结构的字段,点符号可以与结构指针一起使用-指针将自动解引用。

149694d6b2834c41b951dc1a9f3812f4.png

结果:

$ go run structs.go

{Bob 20}

{Alice 30}

{Fred 0}

&{Ann 40}

&{Jon 42}

Sean

50

51

Method方法

Go支持在结构类型上定义方法。在定义方法时,函数名前声明此方法的接收器,此函数即成为该接收器所属类型的方法,如下所示,area方法的接收器为*rect。可以为值接收器或指针接收器定义方法,使用哪种接收器由是否需要在方法中更改接收器内部状态来决定。

下面的例子中使用两种类型的接收器为结构rect定义方法。调用方法时,Go会自动处理值和指针之间的转换。指针接收器的好处是避免对结构所有域的值进行复制,或允许该方法在对结构的域的值进行修改。

28df3fbfb083cdfd3757d7b737d4f3a9.png

结果:

$ go run methods.go

area: 50

perim: 30

area: 50

perim: 30

Interface接口

接口是方法签名的命名集合。下面的例子显示了一个用于几何图形的基本接口。矩形和圆形类型要实现此接口。实现一个Go接口,只需要在该类型上完成接口中的所有方法即可。如下所示,矩形和圆形都实现了该接口。

如果一个类型实现某个接口,那么可以把这个类型的变量赋给接口的变量,通过接口变量来操作类型变量,这样可以实现通用函数。如下所示measure是一个通用函数,它可以处理任何几何体。circle和rect结构都实现了geometry接口,所有都可以把它们的实例作为参数传递给measure函数。

57064b17e39e16e620f8ee5670aa4e3f.png

结果:

$ go run interfaces.go

{3 4}

12

14

{5}

78.53981633974483

31.41592653589793

Error错误

在Go中,习惯上通过一个显式的、单独的返回值来传递错误消息。这与Java和Ruby中的异常以及C中结果/错误值形成了对比。

Go的方式使我们可以很容易地看到哪些函数返回错误,并使用与处理其他非错误任务相同的语言结构来处理它们。习惯上,错误值放在返回值中的最后一个,类型为error,是这Go的一个内置接口。

errors.New用给定的错误消息构造一个基本的错误值。在错误值的位置使用nil值表示没有错误发生。通过在自定义类型上实现Error方法后,也可以将其用作错误值。下面的例子中使用了自定义类型显式地表示传递进错误的参数,初始化错误值并作为返回值的最后一个值返回。请注意,在if行上做错误检测是Go代码中常见的用法,错误值为nil没有错误发生,否则有错误。如果要在代码中访问自定义错误中的数据,则需要通过类型断言的方式获得该错误类型的实例。

7b7f13d8687d157607da2c4a08d1c492.png

结果:

$ go run errors.go

f1 worked: 10

f1 failed: can't work with 42

f2 worked: 10

f2 failed: 42 - can't work with it

42

can't work with it

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值