初识Golang,Golang 中的结构体和方法

引言

最近在实习,本来之前一直都是Java,由于这边需要转golang,特地将学习总结记录一下,加深一下自己的印象。

定义

golang 并没有像Java 中的类这样的概念,取而代之的是结构体,这个结构体的定义类似于C++语言中的结构体,可以将多种数据类型结合在一起,包括结构体类型。

结构体的定义:

go 复制代码
type MyStruct struct {
    Field int
    Field2 [type]
}

与之不同的是,golang中的结构体有方法这样一个概念,类似于Java 中类中有字段和方法一样,在golang的结构体中也会有方法。但是其定义方式与Java 不同。

具体定义方式是在这个结构体外面定义的,具体如下:

go 复制代码
func (variable_name variable_data_type) function_name() [return_type]{
   /* 函数体*/
}

// 举例说明
func (ms MyStruct) GetValue() int {
    return ms.Field
}

// MyStruct 指针类型的方法
func (ms *MyStruct) SetValue(val int) {
    ms.Field = val
}

其中,variable_data_type,这个变量类型就是我们的结构体类型,代表着在某个结构体中定义方法。这里我们称之为接受者,那么具体的方法的定义为:一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。

那么针对接受者来说,有两种类型,一种是值接受者,另一种是指针接受者,其有一些区别:

  1. 指针接收器 (Pointer Receiver):
    • 使用指针类型作为接收器的方法能够修改接收器指向的值。当方法需要改变接收器内部状态或者大对象的改变需要避免开销大的拷贝时,你应该使用指针接收器。
    • 调用该方法时不会进行值的拷贝,而是直接使用原始对象的地址,因此修改会影响到原始对象。
    • 指针接收器也可以在接收器是 nil 指针时调用,你的方法内需要做 nil 值检查以避免运行时错误。
  2. 值接受器
    • 使用值类型作为接收器的方法在调用时会接收调用它的值的一个副本。这意味着方法对该值的任何修改都不会反映到原始对象上。
    • 由于它是在副本上操作,所以不会改变原始对象的内容。当方法不需要修改接收器,或者接收器是小的、不经常改变,或者想保持不变性时,值接收器是合适的选择。
    • 值接收器的方法可以在值和指针类型的变量上调用,Go 会自动处理值和指针之间的转换。

总结

golang 和 Java 不太一样,没有类的概念,但是拥有类的一些实现,其就是通过结构体和方法来实现的。

相关推荐
Gofarlic_oms12 小时前
利用API实现ANSYS许可证管理自动化集成
运维·服务器·开发语言·matlab·自动化·负载均衡
AI+程序员在路上3 小时前
VS Code 完全使用指南:下载、安装、核心功能与 内置AI 编程助手实战
开发语言·人工智能·windows·开源
invicinble3 小时前
这里对java的知识体系做一个全域的介绍
java·开发语言·python
小码哥_常3 小时前
MyBatis-Plus:让数据库操作飞起来的神器
后端
catchadmin3 小时前
使用 PHP TrueAsync 改造 Laravel 协程异步化的可行路径
开发语言·php·laravel
wbs_scy4 小时前
【Linux 线程进阶】进程 vs 线程资源划分 + 线程控制全详解
java·开发语言
2301_811274314 小时前
基于SpringBoot的智能家居管理系统
spring boot·后端·智能家居
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题】【Java基础篇】第15题:JDK1.7中HashMap扩容为什么会发生死循环?如何解决
java·开发语言·数据结构·后端·面试·哈希算法
舒一笑4 小时前
我把设备指纹生成逻辑拆开了:它到底凭什么区分不同设备?
后端·程序员·掘金技术征文
Nicander5 小时前
多数据源下@transcation事务踩坑
java·后端