学习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)
}