GO语言中struct{}和struct{}{}区别

定义一个Stu结构体:

go 复制代码
type Stu struct {
	Name string
}

声明一个Stu类型的变量并赋值:

go 复制代码
var stu Stu
stu.Name = "小红"

声明一个struct类型变量并赋值还有一种方式是使用匿名struct:

go 复制代码
stu := struct {
	Name string
}{
	"小红"
}

还可以用匿名struct声明一个变量,但不赋值:

go 复制代码
stu := struct {
}{
}

strcut{}:大小为0,不占任何内存

struct{}{}:是 struct 类型值,该值为空

比如使用 map 类型构造集合,可以使用这样一个类型的map ------ map[string]struct{},使用 struct{} 类型的值来节省空间。

go 复制代码
package main
import "fmt"

func main() {
	zoo := make(map[string]struct{})
	zoo["monkey"] = struct{}{}
	zoo["tiger"] = struct{}{}
	
	_, ok := zoo["monkey"]
	fmt.Println("Is monkey in the zoo?", ok)

	_, ok := zoo["cat"]
	fmt.Println("Is cat in the zoo?", ok)
}

// 运行结果
// Is monkey in the zoo? true
// Is cat in the zoo? false

比如说 LeetCode 1436. 旅行终点站就用到了 map 类型构造集合

go 复制代码
func destCity(paths [][]string) string {
    // 构造起点集合
    set_start := make(map[string]struct{}, len(paths))

    // 构造终点集合(同时也是答案集合,最终元素个数为一)
    set_end := make(map[string]struct{}, len(paths))

    for _, path := range paths {
        start, end := path[0], path[1]
        // 将起点加入起点集合
        set_start[start] = struct{}{}
        // 已经是起点了,就不可能在答案集合里面
        delete(set_end, start)
        if _, ok := set_start[end]; !ok {
            set_end[end] = struct{}{}
        }
    }
    for ans := range set_end {
        return ans
    }
    return ""
}

补充:

go 复制代码
package main
import "fmt"

func main() {
    var s struct{} // 空结构体,作为占位符或标记,作为值可以节省内存空间,不存储任何信息
    fmt.Println(s) // 输出:{}
}
go 复制代码
package main
import "fmt"

func main() {
    s := struct{}{} // 空结构体实例
    fmt.Println(s) // 输出:{}
}
相关推荐
ACP广源盛1392462567319 分钟前
(ACP广源盛)GSV6172---MIPI/LVDS 信号转换为 Type-C/DisplayPort 1.4/HDMI 2.0 并集成嵌入式 MCU
c语言·开发语言·单片机·嵌入式硬件·音视频
不穿格子的程序员30 分钟前
从零开始刷算法-栈-括号匹配
java·开发语言·
雪域迷影1 小时前
C#中通过get请求获取api.open-meteo.com网站的天气数据
开发语言·http·c#·get
yue0081 小时前
C#类继承
java·开发语言·c#
Want5951 小时前
Python汤姆猫
开发语言·python
大鱼七成饱1 小时前
💥 从崩溃到稳定:我踩过的 Rust Tokio 线程池坑(含代码示例)
后端
喵个咪1 小时前
开箱即用的GO后台管理系统 Kratos Admin - 站内信
后端·微服务·go
Larry_Yanan1 小时前
QML学习笔记(五十)QML与C++交互:QML中单例C++对象
开发语言·c++·笔记·qt·学习·ui·交互
凯芸呢1 小时前
Java中的数组(续)
java·开发语言·数据结构·算法·青少年编程·排序算法·idea
竹竹零1 小时前
JacksonUtil--序列化与反序列化
java·开发语言·windows