为什么要创建一个空结构类型?
type FrontierSigner struct{}
它有什么用处?
为什么要创建一个空结构类型?
type FrontierSigner struct{}
它有什么用处?
struct{}
以一种特殊的方式实现。我通常在需要布尔值的地方使用它。例如,代替以下代码:
func main() {
done := make(chan bool, 1)
go func() {
// simulate long running task
time.Sleep(4 * time.Second)
done <- true
fmt.Println("long running task is done")
}()
<-done
close(done)
fmt.Printf("whole program is done.")
}
package main
import (
"fmt"
"time"
)
func main() {
done := make(chan struct{}, 1)
go func() {
// simulate long running task
time.Sleep(4 * time.Second)
done <- struct{}{}
fmt.Println("long running task is done")
}()
<-done
close(done)
fmt.Printf("whole program is done.")
}
以下是空结构体在 IT 技术中的另一种应用,参考链接
type Codec interface {
Encode(w io.Writer, v interface{}) error
Decode(r io.Reader, v interface{}) error
}
type jsonCodec struct{}
func (jsonCodec) Encode(w io.Writer, v interface{}) error {
return json.NewEncoder(w).Encode(v)
}
func (jsonCodec) Decode(r io.Reader, v interface{}) error {
return json.NewDecoder(r).Decode(v)
}
var JSON Codec = jsonCodec{}
func main() {
sobj := struct {
S1 string `json:"s1"`
K3 string `json:"k3"`
}{}
ss := `{"s1": "v1", "k3": "vv3"}`
err := JSON.Decode(strings.NewReader(ss), &sobj)
if err != nil {
fmt.Println(err)
}
fmt.Println(sobj)
}
这是一个简单的API,JSON
变量不会暴露jsonCodec
类型。