Go的基础知识1

1.关键字
break    default      func    interface    select
case     defer        go      map          struct
chan     else         goto    package      switch
const    fallthrough  if      range        type
continue for          import  return       var

2.入口函数
每一个可独立运行的Go程序,必定包含一个package main,在这个main包中必定包含一个入口函数main,而这个函数既没有参数,也没有返回值。

3.定义变量
var name type //定义一个type类型的name变量
var name1,name2,name3 type //定义3个type类型的变量
var name type = value //定义type类型变量并初始化为value
var name1,name2,name3 type = v1,v2,v3 //定义三个type类型变量并分别初始化
var name1,name2,name3 = v1,v2,v3 //定义三个type类型变量并分别初始化
name1,name2,name3 := v1,v2,v3 //定义三个type类型变量并分别初始化,只能在函数内部用
_ 是特殊变量,任何值都会被舍弃

备注:变量如果声明未使用则会编译报错

4.常量
const name = value 定义一个常量,常量的值是数值、bool、
const name type = value 指定类型

5.数值类型
整数类型有无符号和带符号两种。Go同时支持int和uint,这两种类型的长度相同,但具体长度取决于不同编译器的实现。Go里面也有直接定义好位数的类型:rune, int8, int16, int32, int64和byte, uint8, uint16, uint32, uint64。其中rune是int32的别称,byte是uint8的别称。浮点数的类型有float32和float64两种(没有float类型),默认是float64。
Go还支持复数。它的默认类型是complex128(64位实数+64位虚数)。如果需要小一些的,也有complex64(32位实数+32位虚数)

6.字符串
字符串使用UTF-8字符集使用双引号或者反引号,类型是string
字符串可以使用+来连接
用反引号可以声明多行字符串

7.错误类型
内置一个error类型用来处理错误信息,还有一个errors的包可以处理错误

8.分组声明
import(
“fmt”
“os”
)
const(
i = 100
pi = 3.1415
prefix = “Go_”
)

9.iota枚举
const( 
x = iota
y = iota
z
)
那么y=1,z=2
备注:它默认开始值是0,const中每增加一行加1

const (
h, i, j = iota, iota, iota //h=0,i=0,j=0 iota在同一行值相同
)

10.设计原则
大写字母的变量是可以到处的
大写字母开头的函数等同public函数

11.数组array
var arr [n]type 声明一个type类型长度是n的arr数组
b := [10]int{1, 2, 3} //数组前三个元素用1 2 3初始化
c := […]int{4, 5, 6} //go自动计算数组长度
easyArray := [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}} //声明二维数组

12.动态数组slice
var fslice []int  //声明数组,但不带长度
// 声明一个含有10个元素元素类型为byte的数组
var ar = [10]byte {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’}

// 声明两个含有byte的slice
var a, b []byte

// a指向数组的第3个元素开始,并到第五个元素结束,
a = ar[2:5]
//现在a含有的元素: ar[2]、ar[3]和ar[4]

// b是数组ar的另一个slice
b = ar[3:5]
// b的元素是:ar[3]和ar[4]

slice是引用类型,所以当引用改变其中元素的值时,其它的所有引用都会改变该值

13.map类型
map是无序的,每次打印出来的map都会不一样,它不能通过index获取,而必须通过key获取
map的长度是不固定的,也就是和slice一样,也是一种引用类型
内置的len函数同样适用于map,返回map拥有的key的数量
map的值可以很方便的修改,通过numbers[“one”]=11可以很容易的把key为one的字典值改为11
map和其他基本型别不同,它不是thread-safe,在多个go-routine存取时,必须使用mutex lock机制

GO获取表单元素

1.如果使用Form[“username”]获取表单元素需调用ParseForm(),获取到的是数组
2.如果使用FormValue会自动调用ParseForm(),所以可以直接使用FormValue(“username”),获取到的是元素。等同于Form.Get

3.PostForm是获取POST表单当中的元素获取到的是数组,同样需要调用ParseForm(),PostFormValue获取的是元素

参考:https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/04.1.md

Go操作MySQL示例【转】

package main

import (
	_ "github.com/go-sql-driver/mysql"
	"database/sql"
	"fmt"
)

func main() {
	db, err := sql.Open("mysql", "test:test@/test_demo?charset=utf8")
	//检查数据库链接
	checkErr(err)
	//插入数据
	stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
	checkErr(err)
	res, err := stmt.Exec("test", "研发部门", "2012-12-09")
	checkErr(err)
	//获取插入的ID
	id, err := res.LastInsertId()
	checkErr(err)
	fmt.Println(id)
	//更新数据
	stmt, err = db.Prepare("update userinfo set username=? where uid=?")
	checkErr(err)
	res, err = stmt.Exec("test1", id)
	checkErr(err)
	//获取更新的影响行数
	affect, err := res.RowsAffected()
	checkErr(err)
	fmt.Println(affect)
	//查询数据
	rows, err := db.Query("SELECT * FROM userinfo")
	checkErr(err)
	for rows.Next() {
		var uid int
		var username string
		var department string
		var created string
		err = rows.Scan(&uid, &username, &department, &created)
		checkErr(err)
		fmt.Println(uid)
		fmt.Println(username)
		fmt.Println(department)
		fmt.Println(created)
	}
	//删除数据
	stmt, err = db.Prepare("delete from userinfo where uid=?")
	checkErr(err)
	res, err = stmt.Exec(id)
	checkErr(err)
	affect, err = res.RowsAffected()
	checkErr(err)
	fmt.Println(affect)

	db.Close()

}

func checkErr(err error) {
	if err != nil {
		panic(err)
	}
}
GO连接数据库的一些格式
user@unix(/path/to/socket)/dbname?charset=utf8
user:password@tcp(localhost:5555)/dbname?charset=utf8
user:password@/dbname
user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname

Go命令介绍

1.go build	用于编译代码
2.go clean	用来移除当前源码包和关联源码包里面编译生成的文件
_obj/            旧的object目录,由Makefiles遗留
_test/           旧的test目录,由Makefiles遗留
_testmain.go     旧的gotest文件,由Makefiles遗留
test.out         旧的test记录,由Makefiles遗留
build.out        旧的test记录,由Makefiles遗留
*.[568ao]        object文件,由Makefiles遗留

DIR(.exe)        由go build产生
DIR.test(.exe)   由go test -c产生
MAINFILE(.exe)   由go build MAINFILE.go产生
*.so             由 SWIG 产生
3.go fmt 	格式化代码
4.go get	获取远程包
5.go install 生成结果文件并移动到pkg和bin目录下
6.go test	自动读取源码目录*_test.go文件,生成并运行测试用的可执行文件
7.go tool	命令集
8.go generate	便以前自动化生成某类嗲吗
9.godoc		文档工具
10.go version 查看go版本
11.go env 查看当前go的环境变量
12.go run 编译并运行go程序
Tagged