Python:sublime-text3中提示[DECODE ERROR – OUTPUT NOT UTF-8]

遇到这个问题…

在写了一段py脚本,然后ctrl+b执行的时候提示:decode error – output not utf-8.
偶然,遇到这个问题,捣鼓了一晚上.各种改,后来想起一个解决方案,写在这做个备注.

python Logo

解决

依次打开:工具->编译系统->新编译系统,把下面的数据贴到里面,然后ctrl+s,保存,名字可以取成python3或者python3build,都可以,不用输入后缀.

把这个地址[D:/Program Files/Python36-32/python.exe]换成你自己的Python.exe的绝对路径.

{ 
"cmd": ["D:/Program Files/Python36-32/python.exe", "-u", "$file"], 
"file_regex": "^[ ]File \"(…?)\", line ([0-9]*)", 
"selector": "source.python",
"encoding":"cp936" 
}

然后保存,在打开工具->编译系统->选择刚才新增的,ctrl+b编译运行就可以了.

附赠一个简单的py脚本:

if __name__ == '__main__':
	print("123.456.测试")

Golang编译系统的配置如下:

D:\\Go\\bin\\go要换成自己的,Golang只能编译在系统环境变量中配置的GOPATH指定的路径中的.go文件!

{
"shell_cmd": "D:\\Go\\bin\\go run $file",
"encoding": "utf-8"
}

Go:学习笔记整理

说明

下面是我在学习Go期间,整理的一部分数据(只记录了部分对我而言有用的),可以用作参考.不定期更新.

第一个Go程序

在Windows上安装Go,必须在系统环境变量中配置变量:GOPATH(值为Windows路径),Go只会编译执行GOPATH目录中的.go文件.

package main
 
import "fmt"

/*

1.文件名:main.go
2.编译:go build main.go
3.执行:go run main

第一个go程序.

2017.3.3
prd.


*/

func main() {
	fmt.Println("Hello World!")
}

Go语言Logo

变量声明及类型

变量声明

在Go中变量声明,有如下方式:

1.
// 声明不赋值,使用默认值
var age int

2.
// 根据值判断类型
var vname = value

3.
// 省略var,左侧的变量不能已经被声明过.
vname:=value

多个变量

var age,info,name type
var age,info,name = a1,a2,a3
age,info,name := a1,a2,a3

var (
age type
name type
)

在同一个代码块中,age:=10只能存在一次(也就是不能在写一个age:=10);另外,在同一个代码块中如果定义了变量没有使用,编译会报错,给变量赋值也不行,变量必须要使用.

如果要交换两个变量的值,则可以直接:
a,b = b,a

常量

定义之后不会被修改的变量,定义方式:
const name = “job”
或者
const name string = “job”

类型

Go中有以下类型:

类型描述
布尔只有两个值,true或者false
数字整型int和浮点型float.
字符串一串字符表示,Go的字节使用UTF-8编码标识Unicode文本
派生1.指针;2.数组;3.结构化类型(struct);4.联合体类;5.函数类型;6.切片类型 ;7.接口;8.Map类型;9.Channel类型

整数类型最大值与最小值(获取方式下面有调用示例)

类型描述
uint8最小值:0,最大值:调用math.MaxUint8
uint16最小值:0,最大值:调用math.MaxUint16
uint32最小值:0,最大值:调用math.MaxUint32
uint64最小值:0,最大值:调用math.MaxUint64
int8最小值:MinInt8,最大值:调用math.MaxInt8
int16最小值:MinInt16,最大值:调用math.MaxInt16
int32最小值:MinInt32,最大值:调用math.MaxInt32
int64最小值:MinInt64,最大值:调用math.MaxInt64

调用示例

package main

import (
	"fmt"
	"math"
)

/*

Go数字类型最大值与最小值

2017.4.7
prd.

*/

func main() {
	fmt.Println("Hello World!")
	fmt.Println(math.MinInt32)  // int32 最小值
	fmt.Println(math.MaxInt32)  // int32 最大值
	fmt.Println(math.MaxUint32) // uint32 最大值,最小值:0
}

浮点类型:

类型描述
float32调用:math.MaxFloat32
float64调用:math.MaxFloat32
complex64调用:math.SmallestNonzeroFloat32
complex128调用:math.SmallestNonzeroFloat64

Go时间格式化

Go是个奇葩!!!
我们一般的格式化是:yyyy-MM-dd HH:mm:ss,在Go中必须是这样:”2006-01-02 15:04:05″,嗯,你没看错,据说这个时间是Go诞生的时间.

那么使用格式化,例子来了:

package main

import (
	"fmt"
	"time"
)

/*

Go时间格式化

2017.4.7
prd.

*/

func main() {
	fmt.Println("Hello World!")
	fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
	fmt.Println(time.Now().Format("2006-01-02 15:04"))
	fmt.Println(time.Now().Format("200601021504"))
	fmt.Println(time.Now().Format("2006/01/02 15/04"))
	fmt.Println(time.Now().Format("2006-01-02"))
	/*
				官方常量定义(更多请参考官方文档的time包):
					const (
		    ANSIC       = "Mon Jan _2 15:04:05 2006"
		    UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
		    RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
		    RFC822      = "02 Jan 06 15:04 MST"
		    RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
		    RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
		    RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
		    RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
		    RFC3339     = "2006-01-02T15:04:05Z07:00"
		    RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
		    Kitchen     = "3:04PM"
		    // Handy time stamps.
		    Stamp      = "Jan _2 15:04:05"
		    StampMilli = "Jan _2 15:04:05.000"
		    StampMicro = "Jan _2 15:04:05.000000"
		    StampNano  = "Jan _2 15:04:05.000000000"
		)

	*/
	fmt.Println(time.Now().Format(time.RFC3339))
}

Go:解析JSON

开始

按照《Go语言编程》第五章的例子来的…(有很大改动,不然运行不了)
这本书是2012年左右出的,那时候Golang还没出1.0版本.
而现在Golang已经1.8版本了,改了不少东西才能正常的跑起来……
大概2017-03-11 0:30 开始写的…
这会3:15
……

搞完静态文件(就一个妹子UI的CSS),
已经3.40了…

还查了不少golang的文档,这下算是入坑了..

这是昨天改的一个梨子,也先贴一下吧.

Go相册网站程序

还有个问题,就是上传的图片名称会多一段数字,暂时没处理,但是不影响查看。
使用Go版本1.8

Go相册程序目录结构
uploads目录下面的文件是上传的,上传之后就可以看到了


package main

// 文件:photoweb.go
import (
	"io"
	"os"
	"log"
	"path"
	"net/http"
	"fmt"
	"io/ioutil"
	"html/template"
	"runtime/debug"
	"path/filepath"
)

/*
		 -----------------**********--------------------------------


		 运行方式: Golang 1.8 ,sublime text3 (安装之后要设置一个Go项目文件夹[go.exe只会从这个目录下面找可执行文件],具体百度)
		 
		 文件放在:E:\TMP\go\
		 目录下面,项目名字叫photoweb

		 然后直接启动就行,接着打开浏览器访问:
		 	http://localhost:8080/


		 搞定.
		 按照《Go语言编程》第五章的例子来的...(有很大改动,不然运行不了)
		 这本书是2012年左右出的,那时候Golang还没出1.0版本.
		 而现在Golang已经1.8版本了,改了不少东西才能正常的跑起来......
		 大概2017-03-11 0:30 开始写的...
		 这会3:15
		 ......

		 搞完静态文件(就一个妹子UI的CSS),
		 已经3.40了...

		 还查了不少golang的文档,这下算是入坑了..

		 by prd.


*/

const(
	ListDir = 0x0001
	UPLOAD_DIR="E:\\TMP\\go\\photoweb\\uploads\\"
	TEMPLATE_DIR = "./views"
)


var templates = make(map[string]*template.Template)
var tmpl = "tmpl"

/*

用不了,换了

// 静态文件读取
func staticDirHandler(mux *http.ServeMux,prefix string,
	staticDir string,flags int) {
	mux.HandleFunc(prefix,func(w http.ResponseWriter,r *http.Request){
		fileinfo := staticDir + r.URL.Path[len(prefix)-1:]
		fmt.Println(fileinfo)
		if (flags & ListDir) == 0 {
			if exists := isExists(fileinfo); !exists{
				http.NotFound(w,r)
				return
			}
		}
			http.ServeFile(w,r,fileinfo)
		})
}*/

// 错误处理
func check(err error) {
	if err != nil {
		panic(err)
	}
}


/* 上传图片. */
func uploadHandler(w http.ResponseWriter,r *http.Request) {
	if r.Method == "GET"{
		renderHtml(w,"upload.html",nil)
		//t.Execute(w,nil)
	}
	if r.Method == "POST"{
		f,h,err := r.FormFile("image")
		if err != nil {
			check(err)
			return
		}
		var filenamesinfo = h.Filename
		defer f.Close()
		fmt.Println(filenamesinfo)
		t,err := ioutil.TempFile(UPLOAD_DIR,filenamesinfo)
		check(err)
		defer t.Close()
		io.Copy(t,f)
		check(err)
		fainfo := filepath.Base(t.Name())
		fmt.Println("____________________")
		fmt.Println(fainfo)
		fmt.Println("____________________")
		http.Redirect(w,r,"view?id="+fainfo,http.StatusFound)
		}
}

/* 显示图片. */
func viewHandler(w http.ResponseWriter,r *http.Request) {
	imageId := r.FormValue("id")
	imagePath := UPLOAD_DIR + "\\" + imageId
	if exists := isExists(imagePath);!exists{
		http.NotFound(w,r)
		return
	}
	w.Header().Set("Content-Type","image")
	http.ServeFile(w,r,imagePath)
}

// 检查文件是否存在.
func isExists(path string) bool {
	_,err := os.Stat(path)
	if err == nil {
		return true
	}
	return os.IsExist(err)
}


// 列出所有图片.
func listHandler(w http.ResponseWriter,r *http.Request) {
	fileInfoArr,err := ioutil.ReadDir("E:\\TMP\\go\\photoweb\\uploads\\")
	check(err)
	//var listHtml string
	locals := make(map[string]interface{})
	images := []string{}
	for _,fileInfo := range fileInfoArr{
		//fmt.Println(fileInfo)
		images = append(images,fileInfo.Name())
	}
	locals["images"] = images
	renderHtml(w,"list.html",locals)
}


// 模板渲染方法.
func renderHtml(w http.ResponseWriter,tmpl string,locals map[string]interface{}){
	err := templates[tmpl].Execute(w,locals)
	check(err)
}

// 初始化方法,在main之前运行.
func init() {
	fileInfoArr,err := ioutil.ReadDir(TEMPLATE_DIR)
	fmt.Println(err)
	//panic(err)
	var templateName,templatePath string
	for _,fileInfo := range fileInfoArr{
		fmt.Println("_____")
		fmt.Println(fileInfo.Name())
		templateName = fileInfo.Name() //fileInfo.Name
		if ext := path.Ext(templateName); ext !=".html"{
			continue
		}
		templatePath = TEMPLATE_DIR + "\\" + templateName
		log.Println("Loading template:", templatePath)
		var t =  template.Must(template.ParseFiles(templatePath))
		templates[fileInfo.Name()] = t
	}
}

// 闭包.
func safeHandler(fn http.HandlerFunc)http.HandlerFunc {
	return func (w http.ResponseWriter,r *http.Request) {
		defer func(){
			if err,ok := recover().(error); ok {
				http.Error(w,err.Error(),http.StatusInternalServerError)
				// 或者输出自定义的50X错误页面
				// w.WriteHeader(http.StatusInternalServerError)
				// renderHtml(w,"error",e)
				// logging
				log.Println("WARN: panic in %v - %v ",fn,err)
				log.Println(string(debug.Stack()))
			}


		}()
		fn(w,r)
	}
}

func main() {
	http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
	http.HandleFunc("/",safeHandler(listHandler))
	http.HandleFunc("/upload",safeHandler(uploadHandler))
	http.HandleFunc("/view",safeHandler(viewHandler))
	// 端口.
	err := http.ListenAndServe(":8080",nil)
	if err != nil {
		log.Fatal("ListenAndServe: ",err.Error())
	}
}

列表页:list.html

<!doctype html>
<html>
<head>
	<meta charset="utf-8" />
	<title>列表</title>
	<link rel="stylesheet" type="text/css" href="/static/amazeui.min.css" /> 
</head>	
<body>
	<ol>
		{{ range $.images }}
		<li><a href="/view?id={{.|urlquery}}" target="_blank">{{.|html}}</a></li>
		{{end}}
	</ol>
		<pre>
		 搞定.
		 按照《Go语言编程》第五章的例子来的...(有很大改动,不然运行不了)
		 这本书是2012年左右出的,那时候Golang还没出1.0版本.
		 而现在Golang已经1.8版本了,改了不少东西才能正常的跑起来......
		 大概2017-03-11 0:30 开始写的...
		 这会3:15
		 ......
		 搞完静态文件(就一个妹子UI的CSS),
		 已经3.40了...


		 还查了不少golang的文档,这下算是入坑了..

		 by prd.
		</pre>
	 
	 <a href="/upload">上传</a>
</body>
</html>

上传页面:upload.html

<!doctype html>
<html>
<head>
	<meta charset="utf-8" />
	<title>上传</title>
</head>	
<body>
	<form method="POST" action="/upload"  enctype="multipart/form-data"> 
			  Choose an image to upload: <input name="image" type="file" />
			 <input type="submit" value="Upload" /> 
			</form>
			<a href="/">首页</a>
</body>
</html>

还有一个文件是妹子UI的css,可以在网上直接保存一份(ctrl+s),只是保存到指定目录就可以.[参考地址]

Go语言Logo

解析JSON数据

JSON解析成Go结构体,可以使用这个工具,直接获取相关结构体

源码如下(优先从网络获取数据,若从网络获取、解析失败,则直接使用本地数据[网络获取的数据与本地数据一样]):

package main

import (
	"fmt"
	"net/http"
	"encoding/json"
	"io/ioutil"
)


/**

参考(json to go):
https://mholt.github.io/json-to-go/


golang 解析json字符串.


date:2017-03-11
by:prd.

 */


type JsonInfoObj struct {
	Sites []struct {
		Name    string `json:"Name"`
		URL     string `json:"Url"`
		Country string `json:"Country"`
	} `json:"sites"`
}


/*

获取json数据-本地数据.

*/
func getJson() ([]byte) {
	return []byte(`{"sites":[{"Name":"菜鸟教程","Url":"www.runoob.com","Country":"CN"},{"Name":"Google","Url":"www.google.com","Country":"USA"},{"Name":"Facebook","Url":"www.facebook.com","Country":"USA"},{"Name":"微博","Url":"www.weibo.com","Country":"CN"}]}`)
}

/*

 从网络上获取Json数据.
 此函数获取的结果与getJson()中的内容一致.

 */
func getNetWorkJson() ([]byte) {
	fmt.Println("-----------从网络获取Json数据开始------------")
	resp, err := http.Get("http://www.runoob.com/try/angularjs/data/sites.php")
	if err != nil {
		// panic(err.Error())
		fmt.Println("-----------从网络获取失败,直接返回本地数据------------")
		return getJson()
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		// panic(err.Error())
		fmt.Println("-----------解析网络数据失败,直接返回本地数据------------")
		return getJson()
	}
	fmt.Println("-----------从网络获取Json数据成功------------")
	return body
}

/*

   显示JSON.

 */
func showJson() {
	jsoninfo := getNetWorkJson()
	var siteinfoJson JsonInfoObj
	err := json.Unmarshal(jsoninfo, &siteinfoJson)
	if err != nil {
		fmt.Println("error:", err)
	}
	fmt.Printf("%+v", siteinfoJson)
}

func main() {
	showJson()
}