Golang Type关键字的使用

 更新时间:2023年11月09日 11:15:16   作者:富士康质检员张全蛋  
Type关键字在Go语言中作用很重要,比如定义结构体,接口,还可以自定义类型,定义类型别名等,具有一定的参考价值,感兴趣的可以了解一下

Type关键字在Go语言中作用很重要,比如定义结构体,接口,还可以自定义类型,定义类型别名等。自定义类型由一组值以及作用于这些值的方法组成,类型一般有类型名称,往往从现有类型组合通过Type关键字构造出一个新的类型。

Type 自定义类型

在Go 语言中,基础类型有下面几种:

    bool byte complex64 complex128 error float32 float64
    int int8 int16 int32 int64 rune string
    uint uint8 uint16 uint32 uint64 uintptr

使用 type 关键字可以定义我们自己的类型,如我们可以使用type定义一个新的结构体,但也可以把一个已经存在的类型作为基础类型而定义新类型,然后就可以在我们的代码中使用新的类型名字,这称为自定义类型,如:

type IZ int

这里IZ就是完全是一种新类型,然后我们可以使用下面的方式声明变量:

var a IZ = 5

这里我们可以看到 int 是变量 a 的底层类型,这也使得它们之间存在相互转换的可能。

如果我们有多个类型需要定义,可以使用因式分解关键字的方式,例如:

type (
   IZ int
   FZ float64
   STR string
)

在 type IZ int 中,IZ 就是在 int 类型基础构建的新名称,这称为自定义类型。然后就可以使用 IZ 来操作 int 类型的数据。使用这种方法定义之后的类型可以拥有更多的特性,但是在类型转换时必须显式转换。

每个值都必须在经过编译后属于某个类型(编译器必须能够推断出所有值的类型),因为 Go 语言是一种静态类型语言。在必要以及可行的情况下,一个类型的值可以被转换成另一种类型的值。由于 Go 语言不存在隐式类型转换,因此所有的转换都必须显式说明,就像调用一个函数一样(类型在这里的作用可以看作是一种函数):

valueOfTypeB = typeB(valueOfTypeA)

类型 B 的值 = 类型 B(类型 A 的值)

type TZ int 中,新类型不会拥有原基础类型所附带的方法,如下面代码所示:

package main

import (
    "fmt"
)

type A struct {
    Face int
}
type Aa A // 自定义新类型Aa,没有基础类型A的方法

func (a A) f() {
    fmt.Println("hi ", a.Face)
}

func main() {
    var s A = A{ Face: 9 }
    s.f()

    var sa Aa = Aa{ Face: 9 }
    sa.f()
}

编译错误信息:sa.f undefined (type Aa has no field or method f) 

通过Type 关键字在原有类型基础上构造出一个新类型,我们需要针对新类型来重新创建新方法。

类型系统

很少有编程类的书谈及类型系统(type system)这个话题,实际上类型系统才是一门编程语言的地基,它的地位至关重要。因此,这里我们将从类型系统入手介绍Go语言的面向对象编程特性。

顾名思义,类型系统是指一个语言的类型体系结构。一个典型的类型系统通常包含如下基本

内容:

  • 基础类型,如byte、int、bool、float等
  • 复合类型,如数组、结构体、指针等
  • 可以指向任意对象的类型(Any类型)
  • 值语义和引用语义
  • 面向对象,即所有具备面向对象特征(比如成员方法)的类型
  • 接口

类型系统描述的是这些内容在一个语言中如何被关联。

为类型添加方法

在Go语言中,你可以给任意类型(包括内置类型,但不包括指针类型)添加相应的方法,

例如:

type Integer int

func (a Integer) Less(b Integer) bool { 
  return a < b 
}

在这个例子中,我们定义了一个新类型 Integer ,它和 int 没有本质不同,只是它为内置的

int 类型增加了个新方法 Less() 。 这样实现了Integer 后,就可以让整型像一个普通的类一样使用:

func main() { 
 var a Integer = 1 

 if a.Less(2) { 
    fmt.Println(a, "Less 2") 
 } 
}

只有在你需要修改对象的时候,才必须用指针。它不是Go语言的约束,而是一种自然约束。

举个例子:

func (a *Integer) Add(b Integer) { 
   *a += b 
}

这里为 Integer 类型增加了 Add() 方法。由于 Add() 方法需要修改对象的值,所以需要用指针引用。调用如下:

func main() { 
 var a Integer = 1 
 a.Add(2) 
 fmt.Println("a =", a) 
}

运行该程序,得到的结果是: a=3 。如果你实现成员方法时传入的不是指针而是值(即传入

Integer ,而非 *Integer ),如下所示:

func (a Integer) Add(b Integer) { 
  a += b 
}

那么运行程序得到的结果是 a=1 ,也就是维持原来的值。读者可以亲自动手尝试一下。

究其原因,是因为 Go 语言和 C 语言一样,类型都是基于值传递的。要想修改变量的值,只能传递指针。

到此这篇关于Golang Type关键字的使用的文章就介绍到这了,更多相关Golang Type关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GO语言创建钱包并遍历钱包(wallet)的实现代码

    GO语言创建钱包并遍历钱包(wallet)的实现代码

    比特币钱包实际上是一个密钥对,当你安装 一个钱包应用,或者是使用一个比特币客户端来生成一个新地址是,他就会为你生成一个密钥对,今天通过本文给大家分享go语言遍历钱包的相关知识,一起看看吧
    2021-05-05
  • 重学Go语言之基础数据类型详解

    重学Go语言之基础数据类型详解

    Go语言有非常强大的数据类型系统,其支持的数据类型大体上可分为四类:基础数据类型、引用数据类型、接口类型、复合类型。本文就来讲讲它们各自的用法吧
    2023-02-02
  • 详解go语言 make(chan int, 1) 和 make (chan int) 的区别

    详解go语言 make(chan int, 1) 和 make (chan int) 的区别

    这篇文章主要介绍了go语言 make(chan int, 1) 和 make (chan int) 的区别,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • golang validator库参数校验实用技巧干货

    golang validator库参数校验实用技巧干货

    这篇文章主要为大家介绍了validator库参数校验实用技巧干货,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • go语言context包功能及操作使用详解

    go语言context包功能及操作使用详解

    这篇文章主要为大家介绍了go语言context包功能及操作使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 基于Golang实现Redis分布式锁解决秒杀问题

    基于Golang实现Redis分布式锁解决秒杀问题

    这篇文章主要给大家介绍了使用Golang实现Redis分布式锁解决秒杀问题,文中有详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • go语言题解LeetCode1128等价多米诺骨牌对的数量

    go语言题解LeetCode1128等价多米诺骨牌对的数量

    这篇文章主要为大家介绍了go语言题解LeetCode1128等价多米诺骨牌对的数量示例详解,
    2022-12-12
  • Go代码格式化gofmt的使用方法实例

    Go代码格式化gofmt的使用方法实例

    Golang制定了统一的官方代码风格,并推出gofmt工具(go fmt)来帮助开发人员格式化代码到统一的风格,下面这篇文章主要给大家介绍了关于Go代码格式化gofmt的使用方法,需要的朋友可以参考下
    2023-04-04
  • Golang WebView跨平台的桌面应用库的使用

    Golang WebView跨平台的桌面应用库的使用

    Golang WebView是一个强大的桌面应用库,本文介绍了Golang WebView的特点和使用方法,并列举示例详细的介绍了其在实际项目中的应用,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • go语言制作端口扫描器

    go语言制作端口扫描器

    本文给大家分享的是使用go语言编写的TCP端口扫描器,可以选择IP范围,扫描的端口,以及多线程,有需要的小伙伴可以参考下。
    2015-03-03

最新评论