0

0

golang type什么意思

爱喝马黛茶的安东尼

爱喝马黛茶的安东尼

发布时间:2019-12-10 10:26:04

|

4130人浏览过

|

来源于php中文网

原创

golang type什么意思

type是go语法里的重要而且常用的关键字,type绝不只是对应于C/C++中的typedef。type又有两种使用方式,一种是类型别名,一种是类型定义,是不是熟悉的C语言(define和typedef)味道?

类型定义

type Student struct {
  name String
  age int
}
type I int

类型别名

type Sdt = Student
type I = int

type有如下几种用法:

立即学习go语言免费学习笔记(深入)”;

定义结构体

定义接口

类型定义

类型别名

类型查询

定义结构体

结构体是用户自定义的一种抽象的数据结构,golang中struct类似于java语言中的class, 在程序设计中,有着举足轻重的地位。结构体的用法,将会在struct关键字中详细的介绍。下边来看一下定义一个结构体的语法格式:

type name struct {
    Field1  dataType
    Field2  dataType
    Field3  dataType
}

定义接口

接口相关知识点,将会在interface关键字中详细介绍,下边来看一段定义接口的语法格式:

type name interface{
    Read()
    Write()
}

类型定义

使用类型定义定义出来的类型与原类型不相同,所以不能使用新类型变量赋值给原类型变量,除非使用强制类型转换。下面来看一段示例代码,根据string类型,定义一种新的类型,新类型名称是name:

type name string

为什么要使用类型定义呢?

类型定义可以在原类型的基础上创造出新的类型,有些场合下可以使代码更加简洁,如下边示例代码:

package main
import (
  "fmt"
)
// 定义一个接收一个字符串类型参数的函数类型
type handle func(str string)
// exec函数,接收handle类型的参数
func exec(f handle) {
  f("hello")
}
func main() {
  // 定义一个函数类型变量,这个函数接收一个字符串类型的参数
  var p = func(str string) {
    fmt.Println("first", str)
  }
  exec(p)
  // 匿名函数作为参数直接传递给exec函数
  exec(func(str string) {
    fmt.Println("second", str)
  })
}

输出信息是:

first hello
second hello

上边的示例是类型定义的一种简单应用场合,如果不使用类型定义,那么想要实现上边示例中的功能,应该怎么书写这段代码呢?

Detect GPT
Detect GPT

一个Chrome插件,检测您浏览的页面是否包含人工智能生成的内容

下载
// exec函数,接收handle类型的参数
func exec(f func(str string)) {
  f("hello")
}

exec函数中的参数类型,需要替换成func(str string)了,咋一看去也不复杂,但是假如exec接收一个需要5个参数的函数变量呢?是不是感觉参数列表就会很长了。

func exec(f func(str string, str2 string, num int, money float64, flag bool)) {
  f("hello")
}

从上边的代码可以发现,exec函数的参数列表可读性变差了。下边再来看看使用类型定义是怎么实现这个功能:

package main
import (
  "fmt"
)
// 定义一个需要五个参数的函数类型
type handle func(str string, str2 string, num int, money float64, flag bool)
// exec函数,接收handle类型的参数
func exec(f handle) {
  f("hello", "world", 10, 11.23, true)
}
func demo(str string, str2 string, num int, money float64, flag bool) {
  fmt.Println(str, str2, num, money, flag)
}
func main() {
  exec(demo)
}

类型别名

类型别名这个特性在golang1.9中引入。使用类型别名定义出来的类型与原类型一样,即可以与原类型变量互相赋值,又拥有了原类型的所有方法集。给strng类型取一个别名,别名名称是name:

type name = string

类型别名与类型定义不同之处在于,使用类型别名需要在别名和原类型之间加上赋值符号(=);使用类型别名定义的类型与原类型等价,而使用类型定义出来的类型是一种新的类型。

如下边示例:

package main
import (
  "fmt"
)
type a = string
type b string
func SayA(str a) {
  fmt.Println(str)
}
func SayB(str b) {
  fmt.Println(str)
}
func main() {
  var str = "test"
  SayA(str)
  
  //错误参数传递,str是字符串类型,不能赋值给b类型变量
  SayB(str)
}

这段代码在编译时会出现如下错误:

.\main.go:21:6: cannot use str (type string) as type b in argument to SayB

从错误信息可知,str为字符串类型,不能当做b类型参数传入SayB函数中。而str却可以当做a类型参数传入到SayA函数中。由此可见,使用类型别名定义的类型与原类型一致,而类型定义定义出来的类型,是一种新的类型。

给类型别名新增方法,会添加到原类型方法集中

给类型别名新增方法后,原类型也能使用这个方法。下边请看一段示例代码:

package main
import (
  "fmt"
)
// 根据string类型,定义类型S
type S string
func (r *S) Hi() {
  fmt.Println("S hi")
}
// 定义S的类型别名为T
type T = S
func (r *T) Hello() {
  fmt.Println("T hello")
}
// 函数参数接收S类型的指针变量
func exec(obj *S) {
  obj.Hello()
  obj.Hi()
}
func main() {
  t := new(T)
  s := new(S)
  exec(s)
  // 将T类型指针变量传递给S类型指针变量
  exec(t)
}

输出信息是:

T hello
S hi
T hello
S hi

上边的示例中,S是原类型,T是S类型别名。在给T增加了Hello方法后,S类型的变量也可以使用Hello方法。说明给类型别名新增方法后,原类型也能使用这个方法。从示例中可知,变量t可以赋值给S类型变量s,所以类型别名是给原类型取了一个小名,本质上没有发生任何变化。

类型别名,只能对同一个包中的自定义类型产生作用。举个例子,golang sdk中有很多个包,是不是我们可以使用类型别名,给sdk包中的结构体类型新增方法呢?答案是:不行。请牢记一点:类型别名,只能对包内的类型产生作用,对包外的类型采用类型别名,在编译时将会提示如下信息:

cannot define new methods on non-local type string

类型查询

类型查询,就是根据变量,查询这个变量的类型。为什么会有这样的需求呢?goalng中有一个特殊的类型interface{},这个类型可以被任何类型的变量赋值,如果想要知道到底是哪个类型的变量赋值给了interface{}类型变量,就需要使用类型查询来解决这个需求,示例代码如下:

package main
import (
  "fmt"
)
func main() {
    // 定义一个interface{}类型变量,并使用string类型值”abc“初始化
    var a interface{} = "abc"
    
    // 在switch中使用 变量名.(type) 查询变量是由哪个类型数据赋值。
    switch v := a.(type) {
    case string:
      fmt.Println("字符串")
    case int:
        fmt.Println("整型")
    default:
      fmt.Println("其他类型", v)
    }
}

如果使用.(type)查询类型的变量不是interface{}类型,则在编译时会报如下错误:

cannot type switch on non-interface value a (type string)

如果在switch以外地方使用.(type),则在编译时会提示如下错误:

use of .(type) outside type switch

所以,使用type进行类型查询时,只能在switch中使用,且使用类型查询的变量类型必须是interface{}

PHP中文网,有大量免费的Golang入门教程,欢迎大家学习!

相关专题

更多
云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

0

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

20

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

62

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

19

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

160

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
golang socket 编程
golang socket 编程

共2课时 | 0.1万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

golang和swoole核心底层分析
golang和swoole核心底层分析

共3课时 | 0.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号