Go语言中的自定义类型与类型别名详解

 更新时间:2026年04月16日 09:56:42   作者:王码码2035哦  
文章介绍了Go语言中的自定义类型和类型别名,自定义类型使用type关键字创建,基于基本类型、结构体或接口,类型别名使用typealias=original语法,创建新名称引用原有类型,文章介绍的非常详细,感兴趣的朋友一起看看吧

1. 自定义类型

在Go语言中,我们可以使用type关键字创建自定义类型。自定义类型可以基于基本类型、结构体、接口等创建。

1.1 基于基本类型创建自定义类型

package main
import "fmt"
// 基于int创建自定义类型
type MyInt int
// 为自定义类型添加方法
func (m MyInt) Add(other MyInt) MyInt {
	return m + other
}
func main() {
	var a MyInt = 10
	var b MyInt = 20
	fmt.Println("a + b =", a.Add(b))
}

1.2 基于结构体创建自定义类型

package main
import "fmt"
type Person struct {
	Name string
	Age  int
}
// 为Person添加方法
func (p Person) Greet() string {
	return fmt.Sprintf("Hello, my name is %s and I'm %d years old", p.Name, p.Age)
}
func main() {
	p := Person{Name: "Alice", Age: 30}
	fmt.Println(p.Greet())
}

2. 类型别名

类型别名使用type alias = original语法,它创建一个新的名称来引用原有类型,但不会创建新的类型。

package main
import "fmt"
// 类型别名
type MyString = string
type IntSlice = []int
func main() {
	var s MyString = "Hello"
	fmt.Println(s)
	var numbers IntSlice = []int{1, 2, 3, 4, 5}
	fmt.Println(numbers)
}

3. 自定义类型与类型别名的区别

特性自定义类型类型别名
语法type NewType OriginalTypetype NewType = OriginalType
类型关系新类型与原类型不同新名称是原类型的别名
方法可以为新类型添加方法共享原类型的方法
转换需要显式转换可以隐式转换

4. 实战应用

4.1 领域特定类型

package main
import "fmt"
type Temperature float64
type Distance int
func (t Temperature) Celsius() Temperature {
	return t
}
func (t Temperature) Fahrenheit() Temperature {
	return t*9/5 + 32
}
func main() {
	temp := Temperature(25)
	fmt.Printf("%f°C = %f°F\n", temp.Celsius(), temp.Fahrenheit())
}

4.2 类型安全

package main
import "fmt"
type UserID int
type ProductID int
func getUser(id UserID) string {
	return fmt.Sprintf("User %d", id)
}
func getProduct(id ProductID) string {
	return fmt.Sprintf("Product %d", id)
}
func main() {
	userID := UserID(1)
	productID := ProductID(2)
	fmt.Println(getUser(userID))
	fmt.Println(getProduct(productID))
	// 类型安全,下面的代码会编译错误
	// getUser(productID) // 类型不匹配
}

5. 总结

  • 自定义类型创建新的类型,提供更好的类型安全
  • 类型别名只是原类型的新名称,方便代码重构和迁移
  • 合理使用自定义类型可以提高代码的可读性和可维护性
  • 为自定义类型添加方法可以实现面向对象的编程范式

到此这篇关于Go语言中的自定义类型与类型别名详解的文章就介绍到这了,更多相关go自定义类型与类型别名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang解析html网页的方法

    golang解析html网页的方法

    今天小编就为大家分享一篇golang解析html网页的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • go语言获取系统盘符的方法

    go语言获取系统盘符的方法

    这篇文章主要介绍了go语言获取系统盘符的方法,涉及Go语言调用winapi获取系统硬件信息的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Go语言基础单元测试与性能测试示例详解

    Go语言基础单元测试与性能测试示例详解

    这篇文章主要为大家介绍了Go语言基础单元测试与性能测试示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步
    2021-11-11
  • Golang 实现Redis 协议解析器的解决方案

    Golang 实现Redis 协议解析器的解决方案

    这篇文章主要介绍了Golang   实现 Redis 协议解析器,本文将分别介绍Redis 通信协议 以及 协议解析器 的实现,若您对协议有所了解可以直接阅读协议解析器部分,需要的朋友可以参考下
    2022-10-10
  • 一文教你如何在Golang中用好泛型

    一文教你如何在Golang中用好泛型

    golang的泛型已经出来了一年多了,从提案被接受开始我就在关注泛型了,好用是好用,但问题也很多,所以本文就来教大家如何在Golang中用好泛型吧
    2023-07-07
  • 以go为例探究beyla从环境变量BEYLA_OPEN_PORT发现进程原理

    以go为例探究beyla从环境变量BEYLA_OPEN_PORT发现进程原理

    这篇文章主要为大家介绍了以golang进程为例,研究beyla从环境变量BEYLA_OPEN_PORT(即通过端口)发现进程的原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 解决Golang并发工具Singleflight的问题

    解决Golang并发工具Singleflight的问题

    前段时间在一个项目里使用到了分布式锁进行共享资源的访问限制,后来了解到Golang里还能够使用singleflight对共享资源的访问做限制,于是利用空余时间了解,将知识沉淀下来,并做分享
    2022-05-05
  • 学会提升Go语言编码效率技巧拒绝加班!

    学会提升Go语言编码效率技巧拒绝加班!

    这篇文章主要为大家介绍了Go语言编码效率提升技巧详解,学会了从此拒绝加班,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • golangci-lint安装与Goland集成问题

    golangci-lint安装与Goland集成问题

    这篇文章主要介绍了golangci-lint安装与Goland集成,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • golang执行命令操作 exec.Command

    golang执行命令操作 exec.Command

    这篇文章主要介绍了golang执行命令操作 exec.Command,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论