学习golang时,类似于在Chrome进行工作时收藏的标签的事情

我已经完成了所有的教程,但在实战中的经验并不太多。

同时检查个别处理并进行实施。

作为基于Golang的CUI命令的参考基础

使用Golang实现的CUI命令- Qiita

关于Golang中的defer文和panic/recover机制的讨论 – CUBE SUGAR CONTAINER

有关Golang中的defer语句和panic/recover机制的讨论- CUBE SUGAR CONTAINER

defer在中文里有个终止处理的意思。像一个类。

听说在发生panic()时也会被调用。

如果 panic/recover 机制在其他语言中的行为类似于异常机制,那么如何正确使用 error 来区分两者呢?


不应该使用 panic() 将错误传递给外部公开的 API
应该使用多值返回和 error 接口
应该确保 panic() 不会跨包传播
panic/recover 机制在进行深层调用时非常有用
可以通过使用它来提高代码的可读性
换句话说,使用 error 接口作为向外部传递错误的方式是正确的方法,而 panic/recover 应该仅在内部使用。

在接收参数时使用flag包将参数的指针传递进去。可能是在考虑类似的情况下描述的。我并不太了解。这里是在脚本中使用flag包设置参数(flag.Parse)吗?

failure = flag.Bool("failure", false, "失敗させます")
if *failer{...}

使用exec.Command执行外部命令

在中国的Go语言中总结了如何执行外部命令- Qiita

对于处理参数,管道,以及其他想要做的事情,大概能够先大致实现吗?

提取切片的差异。

在Golang中如何找到两个字符串切片之间的差异?- Stack Overflow
http://stackoverflow.com/questions/19374219/how-to-find-the-difference-between-two-slices-of-strings-in-golang

有几个变更版本

func difference(slice1 []string, slice2 []string, bothFlag int) []string {
    var diff []string

    // Loop two times, first to find slice1 strings not in slice2,
    // second loop to find slice2 strings not in slice1
    max := 1
    if bothFlag == 1 {
        max = 2
    }
    for i := 0; i < max; i++ {
        for _, s1 := range slice1 {
            found := false
            for _, s2 := range slice2 {
                if s1 == s2 {
                    found = true
                    break
                }
            }
            // String not found. We add it to return slice
            if !found {
                diff = append(diff, s1)
            }
        }
        // Swap the slices, only if it was the first loop
        if i == 0 {
            slice1, slice2 = slice2, slice1
        }
    }

    return diff
}

用循环覆盖切片。

在Golang中迭代时更改值

for i, attr := range n.Attr {
    if attr.Key == "href" {
        n.Attr[i].Val = "something"
    }
}

密码错误.

“ドキュメント – golang.jp” 的中文翻译为:Golang.jp 的文件资料页。

有几种格式我不太理解。
看起来简单,但是应该写得好吗呢。。

引述指南

逆向引用Golang(数组)
http://ashitani.jp/golangtips/tips_slice.html#slice_Define

逆向引用Golang的数组
http://ashitani.jp/golangtips/tips_slice.html#slice_Define

在Golang中逆向引用(数组)
http://ashitani.jp/golangtips/tips_slice.html#slice_Define

方便的样子 lì de

完成物品

这真不方便啊。连像peco那样可以逐个选择的界面也没有。或许不会被制作出来吧。

package main

import (
    "flag"
    "fmt"
    "time"
    "os"
    "os/exec"
    "log"
    "strings"
    "regexp"
    "io"
    "github.com/comail/colog"
)

const VERSION = `0.0.1`

type ErrMessage struct {
    What string
}

func (e ErrMessage) Error() string {
    return fmt.Sprintf("%v: %v", time.Now(), e.What)
}

var (
    version = flag.Bool("V", false, "display version information")
    failure = flag.Bool("failure", false, "失敗させます")
)

/*
スライスの差分を取得
 */
func difference(slice1 []string, slice2 []string, bothFlag int) []string {
    var diff []string

    // Loop two times, first to find slice1 strings not in slice2,
    // second loop to find slice2 strings not in slice1
    max := 1
    if bothFlag == 1 {
        max = 2
    }
    for i := 0; i < max; i++ {
        for _, s1 := range slice1 {
            found := false
            for _, s2 := range slice2 {
                if s1 == s2 {
                    found = true
                    break
                }
            }
            // String not found. We add it to return slice
            if !found {
                diff = append(diff, s1)
            }
        }
        // Swap the slices, only if it was the first loop
        if i == 0 {
            slice1, slice2 = slice2, slice1
        }
    }

    return diff
}

/*
お気に入りを開く
 */
func openFavorite(str string) (err error) {
    defer func() {
        // panicがおきたらRollback
        if e := recover(); e != nil {
            fmt.Fprintf(os.Stderr, "Rollback!!\n")
            // エラーメッセージフォーマット変換
            x, _ := e.(string)
            err = ErrMessage{x}
        }
    }()

    if *failure {
        // Error発生
        panic("DoSomething error...")
    }

    // お気に入りの定義
    urlList := []string{
        "https://twitter.com/",
    }
    log.Println("======================== urlList ============================")
    log.Println(urlList)

    // ブラウザのタブを取得
    out, err := exec.Command("chrome-cli", "list", "links").Output()
    urlTabs := strings.Split(string(out), "\n")
    re := regexp.MustCompile(`^\[[0-9]+?\] `)
    for i, _ := range urlTabs {
        urlTabs[i] = re.ReplaceAllString(urlTabs[i], "")
        //urlTabs[i] = strings.Replace(urlTabs[i], "/[.*]/", "-", 1) // 最後の引数は回数
    }
    log.Println("======================== urlTabs ============================")
    log.Println(urlTabs)

    // 差分を取得して開く
    diffList := difference(urlList, urlTabs, 0)
    log.Println("======================== diff ============================")
    log.Println(diffList)
    for i, _ := range diffList {
        cmd := exec.Command("chrome-cli", "open", diffList[i])
        stdin, _ := cmd.StdinPipe()
        io.WriteString(stdin, "hoge")
        stdin.Close()
        out, _ := cmd.Output()
        fmt.Printf("結果: %s", out)
    }
    return nil
}

/*
メイン
 */
func main() {
    colog.SetDefaultLevel(colog.LDebug)
    colog.SetMinLevel(colog.LTrace)
    colog.SetFormatter(&colog.StdFormatter{
        Colors: true,
        Flag:   log.Ldate | log.Ltime | log.Lshortfile,
    })
    colog.Register()

    flag.Parse()
    if *version {
        fmt.Printf("openFavorite %s\n", VERSION)
        os.Exit(0)
    }

    str := "do something & commit!!"
    err := openFavorite(str)
    if err != nil {
        fmt.Fprintf(os.Stderr, "%s\n", err)
        os.Exit(1)
    }

    str = "and finish!!"
    fmt.Fprintf(os.Stdout, "%s\n", str)
}

bannerAds