Go 类型系统

这篇具有很好参考价值的文章主要介绍了Go 类型系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、命名类型和未命名类型

命名类型:类型可以通过标识符来表示,这种类型称为命名类型。Go语言的基本类型中有20个预声明简单类型都是命名类型,Go语言还有一种命名类型——用户自定义类型。

未命名类型:一个类型由预声明类型、关键字和操作符组合而成,这个类型称为未命名类型。未命名类型又称为类型字面量(Type Literal),本书中的未命名类型和类型字面量二者等价。

Go语言的基本类型中的复合类型:数组(array)、切片(slice)、字典(map)、通道(channel)、指针(pointer)、函数字面量(function)、结构(struct)和接口(interface)都属于类型字面量,也都是未命名类型。所以,*int、[]int、 [2]int、map[k]v都是未命名类型。

注意:前面所说的结构和接口是未命名类型,这里的结构和接口没有使用type格式定义。

// 使用type声明的是命名类型
type Person struct {
    name string
    age  int
}

func main() {
    // 使用struct字面量声明的是未命名类型
    a := struct {
        name string
        age  int
    }{"Tom", 18}

    fmt.Printf("%T\n", a) // struct { name string; age int }
    fmt.Printf("%v\n", a) // {Tom 18}

    b := Person{"Jerry", 20}
    fmt.Printf("%T\n", b) // main.Person
    fmt.Printf("%v\n", b) // {Jerry 20}
}

命名类型和未命名类型说明如下:

  • 未命名类型和类型字面量是等价的,通常所说的Go语言基本类型中的复合类型就是类型字面量,所以,未命名类型、类型字面量和Go语言基本类型中的复合类型三者等价。
  • 通常所说的Go语言基本类型中的简单类型就是预声明类型,它们都属于命名类型。
  • 预声明类型是命名类型的一种,另一类命名类型是自定义类型。
2、自定义类型

Go语言允许用户定义类型。当用户声明一个新类型时,这个声明就给编译器提供了一个框架,告知必要的内存大小和表示信息。声明后的类型与内置类型的运作方式类似。Go语言中声明用户定义的类型有两种方法,最常用的方法是使用关键字struct,它可以让用户创建一个结构类型。

结构类型通过组合一系列固定且唯一的字段来声明,如下面代码所示。结构中每个字段都会用一个已知类型声明,这个已知类型可以是内置类型,也可以是其他用户定义的类型。

//user在程序里定义一个用户类型
type user struct {
   	name string   
	emai1 string   
    ext int   
    privileged bool
}

//声明user类型的变量,并初始化所有字段
func main() {
	tom := user{
		name:       "Tom",
		email:      "Tom@163.com",
		ext:        123,
		privileged: false,
	}
	fmt.Println(tom)
}

// 第二种形式没有字段名,只声明对应的值,结尾不需要逗号。
// 在这种形式下,值的顺序很重要,必须和结构声明中字段的顺序一致。
lisa := user{"Lisa", "Lisa@example.com ", 123, true}
  • 结构类型的声明,这个声明以关键字type开始,之后是新类型的名字,最后是关键字struct。
  • 这个结构类型有4个字段,每个字段都基于一个内置类型。一旦声明了类型就可以使用这个类型创建值。
type user struct {
	name       string
	email      string
	ext        int
	privileged bool
}

type admin struct {
	person user
	level  string
}

func main() {

	fred := admin{
		person: user{
			name:       "Tom",
			email:      "Tom@163.com",
			ext:        123,
			privileged: false,
		},
		level: "super",
	}

	fmt.Println(fred) // {{Tom Tom@163.com 123 false} super}
}

另一种声明用户定义类型的方法是,基于一个已有的类型,将其作为新类型的类型说明。标准库使用这种声明类型的方法,从内置类型创建出很多更加明确的类型,并赋予更高级的功能:

type Duration int64

上述代码是标准库的time包中的一个类型声明。Duration是一种描述时间隔的类型,单位是纳秒(ns)。这个类型使用内置的int64类型作为其表示,在Duration类型的声明中,将int64类型称为Duration的基础类型。不过,虽然int64是基础类型,但Go语言并不认为Duration和int64是同一种类型,这两个类型是完全不同的、有区别的类型。

类型int64的值不能作为类型Duration的值来用。虽然int64类型是基础类型,Duration类型依然是一个独立的类型。两种不同类型的值即便互相兼容,也不能互相赋值,编译器不会对不同类型的值进行隐式转换。

3、类型的强制转换

描述:由于Go语言是强类型的语言,如果不满足自动转换的条件,则必须进行强制类型转换。

语法:var a T=(T) (b)

非常量类型的变量x可以强制转化并传递给类型T,满足以下任一条件即可:

  • x可以直接赋值给T类型变量。
  • x的类型和T具有相同的底层类型。
  • x的类型和T都是未命名的指针关型,并且指针指向的类型具有相同的成员类型。
  • x的类型和T都是整型,或者都是浮点型。
  • x的类型和T都是复数类型。
  • x是整数值或[]byte类型的值,T是string类型。
  • x是一个字符串,T是[]byte或[]rune。
type Map map[string]string
type iMap Map

func (m Map) print() {
	for _, key := range m {
		fmt.Println(key)
	}
}

// 只要底层类型是slice、map等支持range的类型字面量,新类型仍然可以使用range迭代
func (m iMap) print() {
	for _, key := range m {
		fmt.Println(key)
	}
}

func main() {
	mp := make(map[string]string, 10)
	mp["hi"] = "tata"
	// mp 与 ma 有相同的底层类型map [string]string, 并且mp是未命名类型
	var ma Map = mp

	// im 与 ma 虽然有相同的底层类型,但是二者中没有一个是字面量类型,不能直接赋值,可以强制进行类型转换
	// var im iMap = ma
	var im iMap = (iMap)(ma)
	ma.print() // tata
	im.print() // tata
}

字符串和字节切片之间的转换最常见:

func main() {
	s := "hello,world!"
	var a []byte
	a = []byte(s)
	var b string
	b = string(a)
	var c []rune
	c = []rune(s)
	fmt.Printf("%T\n", a) // []uint8 type是int8的别名
	fmt.Printf("%T\n", b) // string
	fmt.Printf("%T\n", c) // []int32 rune是int32的别名
}

在使用类型的强制转换时,需要注意以下两点:文章来源地址https://www.toymoban.com/news/detail-781553.html

  • 数值类型和string类型之间的相互转换可能造成值部分丢失;其他的转换仅是类型的转换,不会造成值的改变。string和数字之间的转换可使用标准库strconv。
  • Go语言没有语言机制支持指针和interger之间的直接转换,可以使用标准库中的unsafe包进行处理。

到了这里,关于Go 类型系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Golang:Go语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 表达式 注释 接下来让我们来看下简单的代码,该代码输出了\\\"Hello World!\\\": 让我们来看下以上程序的各个部分: 第一

    2024年02月10日
    浏览(13)
  • Linux系统部署Go语言开发运行环境

    Linux系统部署Go语言开发运行环境

    在Linux系统上部署Go语言开发运行环境需要执行以下步骤: 下载Go语言安装包:打开Go官方网站(https://golang.org),在下载页面选择合适的安装包。根据系统架构选择相应的安装包(如Linux 64位),下载并保存到本地。 安装Go语言:打开终端,使用命令行界面进入保存安装包的

    2024年02月14日
    浏览(15)
  • 【Golang】VScode配置Go语言环境

    【Golang】VScode配置Go语言环境

    安装VScode请参考我的上一篇博客:VScode安装_㫪548的博客-CSDN博客 接下来我们直接进入正题: Go语言(又称Golang)是一种开源的编程语言,由Google开发并于2009年首次发布。Go语言具有简洁、高效、可靠和易于阅读的特点,被设计用于解决大型项目的开发需求。它结合了静态类型

    2024年02月03日
    浏览(13)
  • 【GoLang】MAC安装Go语言环境

    【GoLang】MAC安装Go语言环境

    小试牛刀 首先安装VScode软件 或者pycharm mac安装brew软件  brew install go 报了一个错误 不提供这个支持  重新brew install go 之后又重新brew reinstall go 使用go version 可以看到go 的版本 使用go env  可以看到go安装后的配置 配置一个环境变量 vim ~/.zshrc,  

    2024年02月15日
    浏览(15)
  • Go语言(Golang)数据库编程

    要想连接到 SQL 数据库,首先需要加载目标数据库的驱动,驱动里面包含着于该数据库交互的逻辑。 sql.Open() 数据库驱动的名称 数据源名称 得到一个指向 sql.DB 这个 struct 的指针 sql.DB 是用来操作数据库的,它代表了0个或者多个底层连接的池,这些连接由sql 包来维护,sql 包会

    2024年02月03日
    浏览(48)
  • 【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用于存储一组相同类型的元素,但在底层实现和使用方式上存在一些重要的区别。 Go 中数组的长度是不可改变的

    2024年02月15日
    浏览(16)
  • 【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?

    Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 先看一段代码示例: 当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。 首先,Go 语言

    2024年02月14日
    浏览(52)
  • 【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

    【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

    在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义如下: 指针: 指向

    2024年02月14日
    浏览(50)
  • 【Golang】三分钟让你快速了解Go语言&为什么我们需要Go语言?

    【Golang】三分钟让你快速了解Go语言&为什么我们需要Go语言?

    博主简介: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: Go语言核心编程 近期目标: 写好专栏的每一篇文章 Go 语言从 2009 年 9 月 21 日开始作为谷歌公司 20% 兼职项目,即相关

    2023年04月21日
    浏览(13)
  • 【GoLang】哪些大公司正在使用Go语言

    【GoLang】哪些大公司正在使用Go语言

    前言: 随着计算机科学和软件开发的快速发展,编程语言的选择变得愈加关键。 在这个多元化的编程语境中,Go语言(简称Golang)以其简洁、高效、并发处理能力等特性逐渐受到业界关注。 越来越多的大型科技公司纷纷采用Go语言作为其软件开发的首选语言,这种趋势反映了

    2024年02月04日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包