定义一个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) // 输出:{}
}