RSSAmplifier

Joeson Huang's Tech Space · Dec 21, 2020

Go Pitfalls and Patterns

0
Sign in to vote or save

This page did not load. You can still read it on the original site — the toolbar below keeps your place in the directory.

1. 如何获取interface的reflect.Type type Duck interface { Quack () } var reflectTypeOfDuck = reflect . TypeOf ( struct { Duck }) . Field ( 0 ) . Type () func IsDuck ( val reflect . Value ) bool { return val . Type () . Implements ( reflectTypeOfDuck ) } 2. 不要用map[string]interface{}来Unmarshal 避免下面的用法 m := map [ string ] interface {}{} json . Unmarshal ( data , & m ) println ( m [ "message" ] . ( string…

1. 如何获取interface的reflect.Type

type Duck interface {
	Quack()
}
var reflectTypeOfDuck = reflect.TypeOf(struct { Duck }).Field(0).Type()
func IsDuck(val reflect.Value) bool {
	return val.Type().Implements(reflectTypeOfDuck)
}

2. 不要用map[string]interface{}来Unmarshal

避免下面的用法

m := map[string]interface{}{}
json.Unmarshal(data, &m)
println(m["message"].(string)) // 这里转换失败会panic, 除非 message, ok := m["message"].(string)

尝试使用下面的用法

m := struct{
	Message string `json:"message"`
}{}
json.Unmarshal(data, &m)
println(m.Message)

3. defer时机

func f() {
	defer println("a")
	{
		defer println("b")
	}
	if true {
		defer println("c")
	}
	for i := 0; i < 3; i++ {
		defer println(i)
	}
	defer println("end")
}
/*
end
2
1
0
c
b
a
*/

# Go Playgound

注意 {} 中的defer (包括 if, for 中) 均会在函数返回时执行, 而不是出当前作用域

Read on joeosnw.github.io

Comments

Nothing yet. Say the first thing.

    Sign in to join the conversation.