四时宝库

程序员的知识宝库

对付Siri,你知道霍金的轮椅多努力吗!

澎澎和湃湃

2016-04-13 15:26 来自 澎湃联播

字号

人类一思考,上帝就发笑。在咱们地球上,总有不少人,能让上帝笑得背过气去。比如把人生目标定为“完成对宇宙的认知,这包括宇宙为什么是它现在的样子,以及宇宙为什么会存在”的史蒂芬o霍金教授,动动手指眨眨眼,就让上帝笑得大声,笑出声。

为什么要在复活节吃巧克力兔?(为什么要在复活节吃巧克力兔子呢)

复活节(Easter)是西方的一个重要节日,用来纪念耶稣基督复活(the resurrection of Jesus)。

在西方教会传统里,春分之后第一次满月之后的第一个星期日即为复活节。东方教会则规定,如果满月恰逢星期日,则复活节再推迟一周。因此,节期大致在3月22日至4月25日之间。

在这一天,人们不仅要滚彩蛋,还要吃巧克力兔。复活节为什么要吃巧克力兔呢?这要从复活兔说起了。

Photo by Bee Felten-Leidel on Unsplash

安慰人的圣经经文--诗篇(圣经当中安慰人的诗经)


23:1[hgb] ( 大 卫 的 诗 。 ) 耶 和 华 是 我 的 牧 者 。 我 必 不 至 缺 乏 。

程序员应该知道的学习资源(程序员必须知道的知识)

在线教育

  • CodeSchool
  • Codecademy

圣经中英文励志25句名言(圣经中10句最经典名言英文版)

《圣经》是亚伯拉罕诸教的宗教经典,它不仅仅只是一本宗教读物,其中融合着历史、文化、政治、经济。其中的《圣经故事》反映了犹太民族的形成发展,赞颂了犹太人民的智慧与创造力,至今仍有极高的阅读价值。它与希腊文明一起,形成了今天的欧美文化。下面是

CS:GO茄子或到斗鱼直播?真正的人型流量王,自带嘴臭圣经

主播荐一荐:推荐优质“新”主播~

在这个流量为王的时代,不管是网红、明星还是主播,终究逃不过需要流量傍身的结果,流量就意味着人气,也意味着更可观的收入。对于直播圈来说,想提升人气有多种方式,比如几句广为流传的流行语,大司马就是凭这一点迅速蹿红。亦或者自带有趣的梗,比如下面这一位,可能不知道他的名字,但他全身都是梗。

go语言读取yaml配置文件(go语言import)

go get github.com/pythonsite/config_yaml
直接上代码:

// 可以用于处理读yaml格式的配置文件,同时也可以用于理解golang中的反射
package config_yaml

import (
    "strings"
    "errors"
    "io/ioutil"
    "gopkg.in/yaml.v2"
    "reflect"
    "fmt"
    "strconv"
)

type ConfigEngine struct {
    data map[interface{}]interface{}
}


// 将ymal文件中的内容进行加载
func (c *ConfigEngine) Load (path string) error {
    ext := c.guessFileType(path)
    if ext == "" {
        return errors.New("cant not load" + path + " config")
    }
    return c.loadFromYaml(path)
}

//判断配置文件名是否为yaml格式
func (c *ConfigEngine) guessFileType(path string) string {
    s := strings.Split(path,".")
    ext := s[len(s) - 1]
    switch ext {
    case "yaml","yml":
        return "yaml"
    }
    return ""
}

// 将配置yaml文件中的进行加载
func (c *ConfigEngine) loadFromYaml(path string) error {
    yamlS,readErr := ioutil.ReadFile(path)
    if readErr != nil {
        return readErr
    }
    // yaml解析的时候c.data如果没有被初始化,会自动为你做初始化
    err := yaml.Unmarshal(yamlS, &c.data)
    if err != nil {
        return errors.New("can not parse "+ path + " config" )
    }
    return nil
}

// 从配置文件中获取值
func (c *ConfigEngine) Get(name string) interface{}{
    path := strings.Split(name,".")
    data := c.data
    for key, value := range path {
        v, ok := data[value]
        if !ok {
            break
        }
        if (key + 1) == len(path) {
            return v
        }
        if reflect.TypeOf(v).String() == "map[interface {}]interface {}"{
            data = v.(map[interface {}]interface {})
        }
    }
    return nil
}

// 从配置文件中获取string类型的值
func (c *ConfigEngine) GetString(name string) string {
    value := c.Get(name)
    switch value:=value.(type){
    case string:
        return value
    case bool,float64,int:
        return fmt.Sprint(value)
    default:
        return ""
    }
}

// 从配置文件中获取int类型的值
func (c *ConfigEngine) GetInt(name string) int {
    value := c.Get(name)
    switch value := value.(type){
    case string:
        i,_:= strconv.Atoi(value)
        return i
    case int:
        return value
    case bool:
        if value{
            return 1
        }
        return 0
    case float64:
        return int(value)
    default:
        return 0
    }
}

// 从配置文件中获取bool类型的值
func (c *ConfigEngine) GetBool(name string) bool {
    value := c.Get(name)
    switch value := value.(type){
    case string:
        str,_:= strconv.ParseBool(value)
        return str
    case int:
        if value != 0 {
            return true
        }
        return false
    case bool:
        return value
    case float64:
        if value != 0.0 {
            return true
        }
        return false
    default:
        return false
    }
}

// 从配置文件中获取Float64类型的值
func (c *ConfigEngine) GetFloat64(name string) float64 {
    value := c.Get(name)
    switch value := value.(type){
    case string:
        str,_ := strconv.ParseFloat(value,64)
        return str
    case int:
        return float64(value)
    case bool:
        if value {
            return float64(1)
        }
        return float64(0)
    case float64:
        return value
    default:
        return float64(0)
    }
}

// 从配置文件中获取Struct类型的值,这里的struct是你自己定义的根据配置文件
func (c *ConfigEngine) GetStruct(name string,s interface{}) interface{}{
    d := c.Get(name)
    switch d.(type){
    case string:
        c.setField(s,name,d)
    case map[interface{}]interface{}:
        c.mapToStruct(d.(map[interface{}]interface{}), s)
    }
    return s
}

func (c *ConfigEngine) mapToStruct(m map[interface{}]interface{},s interface{}) interface{}{
    for key, value := range m {
        switch key.(type) {
        case string:
            c.setField(s,key.(string),value)
        }
    }
    return s
}

// 这部分代码是重点,需要多看看
func (c *ConfigEngine) setField(obj interface{},name string,value interface{}) error {
    // reflect.Indirect 返回value对应的值
    structValue := reflect.Indirect(reflect.ValueOf(obj))
    structFieldValue := structValue.FieldByName(name)

    // isValid 显示的测试一个空指针
    if !structFieldValue.IsValid() {
        return fmt.Errorf("No such field: %s in obj",name)
    }

    // CanSet判断值是否可以被更改
    if !structFieldValue.CanSet() {
        return fmt.Errorf("Cannot set %s field value", name)
    }

    // 获取要更改值的类型
    structFieldType := structFieldValue.Type()
    val := reflect.ValueOf(value)

    if structFieldType.Kind() == reflect.Struct && val.Kind() == reflect.Map {
        vint := val.Interface()

        switch vint.(type) {
        case map[interface{}]interface{}:
            for key, value := range vint.(map[interface{}]interface{}) {
                c.setField(structFieldValue.Addr().Interface(), key.(string), value)
            }
        case map[string]interface{}:
            for key, value := range vint.(map[string]interface{}) {
                c.setField(structFieldValue.Addr().Interface(), key, value)
            }
        }

    } else {
        if structFieldType != val.Type() {
            return errors.New("Provided value type didn't match obj field type")
        }

        structFieldValue.Set(val)
    }

    return nil
}

关于Go Test这些小技巧,Gopher应该知道

我是一只可爱的土拨鼠,专注于分享 Go 职场、招聘和求职,解 Gopher 之忧!欢迎关注我#Go招聘。

500+本程序员值得看的书籍,7大类,1大合集,收藏,日后有用

一、Golang书籍推荐

入门

使用 Gorilla Mux 和 CockroachDB 编写可维护 RESTful API

本文利用到的 Go 语言相关技术:

  • Gorilla/Mux:功能强大的 URL 路由器和调度组件
  • CockroachDB:开源,云原生分布式 SQL 数据库系统
<< 1 2 3 > >>
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接