Minimal and Clean blog theme for Hugo

解析pptx文件


摘要,显示在meta的description中
Read more ⟶

Styled-Component


安装

npm install --save styled-components

创建样式组件

创建组件

import styled from 'styled-components'
const Button = styled.button``

一般的样式

const Button = styled.button`
  background: transparent;
  border-radius: 3px;
  border: 2px solid palevioletred;
  color: palevioletred;
  margin: 0 1em;
  padding: 0.25em 1em;
`

读取组件参数

const Button = styled.button`
  background: transparent;
  border-radius: 3px;
  border: 2px solid palevioletred;
  color: palevioletred;
  margin: 0 1em;
  padding: 0.25em 1em;

  ${props =>
    props.primary &&
    css`
      background: palevioletred;
      color: white;
    `};
`

子选择器

Read more ⟶

Head-First-Golang


goroutine

main函数就是在一个goroutine中运行的。如果在其中直接运行一个goroutine(a),那么a还没运行完main就运行完了,就会退出程序,所以a相当于没来得及运行。

想要main等内部的goroutine运行结束的话,需要channel。

Read more ⟶

Goland


json转换为go的数据结构定义

  1. copy一段json结构的代码字符串。
  2. ctrl+v 时会有一个dialog提示
  3. 结构体中还有嵌入结构体时,可以用 ctrl + shift + alt + T 然后选择 intorduce type…把嵌入的结构体提取出来为一个独立的结构体。
  4. 可以改变json的名字格式,alt + enter 选择change field name style in tags 选择fieldName
  5. 还可以批量的修改tag的内容,alt + enter 选择 update key value in tags ,输入 ,omitemypty

html/template

默认的html/template文件扩展名是gohtml

https://blog.jetbrains.com/go/2018/12/14/go-templates-made-easy/

Read more ⟶

Head-First-设计模式


第一章

开发中的不变真理——CHANGE

设计原则

  1. 找出应用中可能变化之处,把它们独立出来,不要和哪些不需要变化的代码混在一起。

这是几乎每个设计模式背后的精神所在。所有的模式都提供栏一套方法让“系统中的某部分改变不会影响到其他部分。”

结果如何?代码变化引起的不经意后果变少,系统变得更有弹性。

  1. 针对接口编程,而不是针对实现编程。

将鸭子的行为通过接口定义,同一行为的不同表现有不同的实现。这么一来,有了继承的“复用好处”,却没有继承所带来的包袱。

类之间的关系:IS-A, HAS-A, IMPLEMENTS,“有一个”比“是一个”更好。

  1. 多用组合,少用继承。

软件开发在完成后花费的时间更多,所以要致力于提高可维护性和扩展性。

定义

策略模式定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

继承(is a)–实线三角;实现–虚线三角;有一个–实现箭头;

要点

  • 良好的OO设计必须具备可复用、可扩展、可维护三个特性。

继承的缺点

  1. 代码在多个子类中重复
  2. 运行时的行为不容易改变
  3. 很难知道所有子类的全部行为
  4. 改变会牵一发动全身,造成其他子类不想要的改变。

观察者

装饰器

工厂模式

单例模式

命令模式

设计原则

好莱坞原则

模板方法模式,父类属于高层组件,子类属于底层组件。父类是冲向类,其中有若干具体抽象方法,他们是算法的某部分的具体实现,由子类提供。父类还可以定义钩子,用于控制算法流程。

好莱坞原则是说,高层组件会去调用底层组件的方法,不要反向调用。

这样做的好处是避免环形依赖。解耦,其他代码只依赖高级组件,可以减少整个系统的依赖。

框架中比较多。框架提供模板,实现算法的步骤,细节交给使用者实现。

Read more ⟶

PostgreSQL


允许被远程访问

在目录 /etc/postgresql/9.x/main 下

  1. 允许任意IP的连接请求 postgresql.conf 文件 去掉注释,并修改 listen_addresses = '*'

  2. 允许密码认证

pg_hba.conf 文件

# TYPE  DATABASE  USER  CIDR-ADDRESS  METHOD
host  all  all 0.0.0.0/0 md5
  1. 重启
sudo service postgresql restart
Read more ⟶

创建MergeRequest的CLI工具


使用了这几个库

  • github.com/atotto/clipboard
  • github.com/urfave/cli/v2

gg r 快速的往gitlab提一个 merge request 。

  • bufio.NewReader 读取用户输入
  • go exec 执行命令
  • 读取当前git分支名算法
  • 剪贴板操作
Read more ⟶

开发CLI工具


cli: https://github.com/urfave/cli/blob/master/docs/v2/manual.md

交互式: https://github.com/manifoldco/promptui

app := &cli.App{
		Flags: []cli.Flag {
			&cli.StringFlag{
        Name:        "lang",
        Aliases:     []string{"l"},
				Value:       "english",
				Usage:       "language for the greeting",
				Destination: &language,
			},
		},
		Action: func(c *cli.Context) error {
			name := "someone"
			if c.NArg() > 0 {
				name = c.Args().Get(0)
			}
			if language == "spanish" {
				fmt.Println("Hola", name)
			} else {
				fmt.Println("Hello", name)
			}
			return nil
		},
	}

这段代码里既有 arguments 又有 flag 。在使用命令时,要先输入 flag 后输入 arg

go run main.go -lang=spanish wangshushuo

flag 部分有多种用法可选:

  • -lang=abc
  • –lang=abc
  • –lang abc

如果定义里 Aliase 还可以

  • -l abc

环境变量

定义 EnvVars 可以用来读取环境变量

Read more ⟶

Go Tips


取map的size

用 len() 函数

遍历map

for k, v := range m { 
    fmt.Printf("key[%s] value[%s]\n", k, v)
}

参考

JSON转换

使用encoding/json包的 Unmarshal 和 Marshal 方法,结构体要注明 json

package main

import (
    "fmt"
    "encoding/json"
)

type Data struct {
    Votes *Votes `json:"votes"`
    Count string `json:"count,omitempty"`
}

type Votes struct {
    OptionA string `json:"option_A"`
}

func main() {
    s := `{ "votes": { "option_A": "3" } }`
    data := &Data{
        Votes: &Votes{},
    }
    err := json.Unmarshal([]byte(s), data)
    fmt.Println(err)
    fmt.Println(data.Votes)

    s2, _ := json.Marshal(data)
    fmt.Println(string(s2))

    data.Count = "2"
    s3, _ := json.Marshal(data)
    fmt.Println(string(s3))
}

参考

指定interface{}的类型

var a interface{}
var b string

b = a.(string)

go run 失败

$ go run main.go
# command-line-arguments
.\main.go:4:2: undefined: a
.\main.go:5:2: undefined: average2

main.go 文件引用了 package main 中的另外两个文件中的函数。所以 run 命令应该是这样的

Read more ⟶

5.软件构建中的设计


《代码大全》中的摘录
Read more ⟶