Golang Go语言中的单例模式

发布于 1周前 作者 itying888 来自 Go语言

Golang Go语言中的单例模式

type A struct {
data int
}

var a = A{3}

func Create() *A { return &a }

这个是单例模式吗?

10 回复

package 级别的变量就是单例

更多关于Golang Go语言中的单例模式的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是,没记错你还可以用 init 函数对你的对象进行初始化

你甚至可以使用 sync.Once

请教一下,为什么这个算单例,我在其他地方不一样可以 new 这个 A 么…

一个是新变量,一个是返回已有变量的指针

package 级别的变量就是单例

#4 我也一直有这个疑问,像 Java 里单例第一步就是构造器 private,在外边根本就创建不了这个类的实例,但是 go 好像就只能凭使用者自觉了

你可以让 A 也不对外暴露,每次 Create 返回同一个

#8 刚试了下,不对外暴露的 struct 居然可以有 public 的方法和字段,学到了。但是总感觉有点怪怪的……

在Golang(Go语言)中实现单例模式,主要目的是确保一个类只有一个实例,并提供一个全局访问点。Go语言由于其并发特性和简洁的语法,在实现单例模式时有其独特之处。

单例模式的一种常见实现方式是使用sync.Once类型,它保证了某个操作只被执行一次。以下是一个简单的示例:

package main

import (
	"fmt"
	"sync"
)

type Singleton struct{}

var (
	instance *Singleton
	once     sync.Once
)

// GetInstance 返回单例实例
func GetInstance() *Singleton {
	once.Do(func() {
		instance = &Singleton{}
	})
	return instance
}

func main() {
	s1 := GetInstance()
	s2 := GetInstance()

	// 验证两个实例是否相同
	if s1 == s2 {
		fmt.Println("s1 和 s2 是同一个实例")
	} else {
		fmt.Println("s1 和 s2 不是同一个实例")
	}
}

在这个例子中,sync.OnceDo方法确保instance变量只被初始化一次,无论GetInstance函数被调用多少次。这种方式是线程安全的,适用于并发环境。

此外,Go语言中的单例模式也可以通过其他方式实现,如使用懒汉式(非线程安全,需加锁)、饿汉式(在init函数中初始化)等,但sync.Once通常是最简洁且线程安全的实现方式。

回到顶部