go基础示例

2017/11/09
go基础练习 leaf
go很简洁,像php一样好学
又有很强大的协程
值得好好学习下
go安装直接下载linux

sudo tar -xzf go1.9.1.linux-amd64.tar.gz -C /usr/local
然后编辑/etc/profile
添加
export PATH=$PATH:/usr/local/go/bin
export GOPATH=/home/goweb
source /etc/profile

正文

关于go的字符串需要讲解的特别的多
//只能[]uint8 []rune []int32可以转化为字符串然后进行互转
至于为什么请看go圣经

c1 := sha256.Sum256([]byte("x"))
fmt.Println(c1, reflect.TypeOf(c1))
fmt.Printf("%x\n", c1)

c3 := []byte("Hello")
fmt.Println(string(c3), c3, reflect.TypeOf(c3))

c4 := []rune("hello")
fmt.Println(string(c4), reflect.TypeOf(c4))


package main //包名
import (
	"fmt"
	"os"
	"io/ioutil"
)
//import "fmt" 两种写法 

var name string = "hello" //定义在全局的变量一定要用var关键字 不能隐式赋值
const URL string = "http://www.baidu.com" //全局常量

func main(){ //入口函数
	//声明变量
	var a int //没有初始值时,默认为'零值'
	b := 1  //自动推到变量的类型
	var c,d int = 1,2
	e,f := "string1","string2" //隐式批量赋值
	fmt.Println(a,b,c,d,e,f)

	//声明常量
	const g string = "define"
	fmt.Println(g,name,URL)

	//循环操作 只有for 三种方式
	h:=1
	for h<3{
		fmt.Println(h)
		h++
	}
	//这种方式是最多的
	for g:=0;g<10;g++{
		fmt.Println(g)
	}

	for{ //go中死循环,不加break,加了之后会跳出
		fmt.Println("die loop")
		break
	}

	// if else 分支结构 用了一个经典的所有的结构代表了,和php c都是差不多的,区别不用加() {必须和if同行
	if number:=6;number<6{
		fmt.Println("6666666")
	} else if number >=6  {
		fmt.Println("right")
	} else {
		fmt.Println("error")
	}

	//switch 分支 和大多数语言一样 很简洁

	i := 1

	switch i{
		case 1:
			fmt.Println("111111")
		case 2:
			fmt.Println("222222")
		default:
			fmt.Println("default....")
	}

	//数组 值传递  make不能创建数组  数组必须指定大小,定长 等下会和切片进行比较 
	var arr [5]int //先声明
	arr[0] = 100
	arr1 := [2]int{11,22} //声明赋值
	//arr2 := make([4]int,0) 这样是错误滴
	arr2 := [...]int{11,2,2,3,3,434} //不定长的固定长度数组
	fmt.Println(arr,arr1,arr2)

	var arr3 [2][3]int //2行3列的二维数组
	for i := 0; i < 2; i++ {
		for j := 0; j < 3; j++ {
			arr3[i][j] = i * j
		}
	}
	fmt.Println(arr3)

	//切片 不定长 指针传递 超过cap就要append添加,这样会开一个新的数组,不然报错,不超过可以下标直接赋值
	slice := make([]string,0)
	slice = append(slice,"ok","ok")
	//slice[0]="ok" //错误
	var slice1 []string//声明创建
	//slice1[0] = "ok"报错
	slice1 = append(slice1,"ok","ok")
	modify(slice1)

	slice2 := []string{"hahaha","nonono"} 

	//关于len和cap不在叙述
	fmt.Println(len(slice),cap(slice1),slice2)

	modify(slice)

	fmt.Println(slice1,slice)
	
	//切片计算公式
	对底层数组容量是 k的切片 slice[i:j]来说
	长度: j - i 
	容量: k - i
	
	
	切片案例:
	slice := make([]int, 3, 6)
	slice1 := slice[:]
	slice5 := slice[:]
	slice1 = append(slice1, 11, 22)
	slice[0] = 1000
	fmt.Println(slice, len(slice), cap(slice))
	fmt.Println(slice5[0:5], len(slice5), cap(slice5))
	fmt.Println(slice1, len(slice1), cap(slice1))
	
	从切片中获取切片也是共享底层数组,len决定显示元素的个数,cap底层容量 
	append直接作用到切片直接看到效果,
	间接的切片共享底层数组的不能看到。必须从新初始化长度就是len
	
	
	append 函数常见操作
	我们在第 7.5 节提到的 append 非常有用,它能够用于各种方面的操作:

	将切片 b 的元素追加到切片 a 之后:a = append(a, b...)

	复制切片 a 的元素到新的切片 b 上:

	b = make([]T, len(a))
	copy(b, a)
	删除位于索引 i 的元素:a = append(a[:i], a[i+1:]...)

	切除切片 a 中从索引 i 至 j 位置的元素:a = append(a[:i], a[j:]...)

	为切片 a 扩展 j 个元素长度:a = append(a, make([]T, j)...)

	在索引 i 的位置插入元素 x:a = append(a[:i], append([]T{x}, a[i:]...)...)

	在索引 i 的位置插入长度为 j 的新切片:a = append(a[:i], append(make([]T, j), a[i:]...)...)

	在索引 i 的位置插入切片 b 的所有元素:a = append(a[:i], append(b, a[i:]...)...)

	取出位于切片 a 最末尾的元素 x:x, a = a[len(a)-1], a[:len(a)-1]

	将元素 x 追加到切片 a:a = append(a, x)

	因此,您可以使用切片和 append 操作来表示任意可变长度的序列。

	//字典
	map1 := make(map[string]string)
	map1["map"] = "values"
	fmt.Println(map1)

	var map2 map[string]string
	//map2["ok"] = "values" 报错 字典一定要初始化和创建才能使用

	fmt.Println(map2)

	//遍历 字典
	for _,v:=range map1{
		fmt.Println(v)
	}

	//遍历切片
	for _,v:=range slice2{
		fmt.Println(v)
	}

	//遍历数组
	for _,v:=range arr1{
		fmt.Println(v)
	}

	//go函数 可变长度 函数首字母大小写非常重要,大写相当于php public 小写private只有当前包可见
	GetName("li","ob","go")

	//定义类方法
	var p Persion //声明
	p.Name = "小明"
	p.Sing("在唱歌")

	Stu := Persion{"李明"} //大括号初始化 
	Stu.Sing("在唱歌")

	//defer类似析构方法 写文件操作 OS
	userFile := "./demo.txt"
	file,err := os.Create(userFile) //根据路径创建File的内存地址
	defer file.Close()//最后关闭文件句柄
	if err != nil{
		fmt.Println(err.Error())
		os.Exit(1)
	}
	file.WriteString("HelloWorld\r\n")
	file.Write([]byte("leg's go \r\n"))

	//IO写
	d1 := []byte("hello\ngo\n") //IO
	errinfo := ioutil.WriteFile("demo.txt", d1, 0644)
	if errinfo != nil{
		fmt.Println("error")
	}
	
	//文件读 IO
	readfile,errs := ioutil.ReadFile("./demo.txt")
	if errs != nil {
        fmt.Print(errs)
        os.Exit(1)
    }
	strfile := string(readfile)
	fmt.Println(strfile)

	//文件读os
	file2, err := os.Open("./demo.txt")
	b1 := make([]byte, 5)
	n1, err := file2.Read(b1)
	fmt.Println(string(n1))


}


type Persion struct{
	Name string
}

func (p *Persion)Sing(name string) {
	fmt.Println(p.Name+name)
}

func GetName(args...string){
	for _,v := range args{
		fmt.Println(v)
	}
}

func modify(arr []string){
	arr[0] = "test"
}


简单日期函数转化
t := time.Now()
unixtime := t.Unix()
fmt.Println(unixtime)
s := time.Unix(unixtime, 0).Format("2006-01-02 15:04:05")
fmt.Println(s)

s1 := "2018-03-01 16:12:01"
t1, _ := time.Parse("2006-01-02 15:04:05", s1)
fmt.Println(t1.Unix())



个人随笔

安静的等待,你若盛开,蝴蝶自来

承接高质量 网站开发 app开发 如有需要请点击About联系

@承鹏辉