zoukankan      html  css  js  c++  java
  • Go学习笔记1

    Android还没搞完又要来搞Go了,基础学习笔记,直接代码了.

    ch1 第一个程序入门

    package main
    
    import (
    	"fmt"
    	"os"
    )
    /**
    应用程序入口
    必须是main包:package main
    必须是main方法:func main()
    文件名不一定是main.go
    在hello文件夹下一样可以执行
    
    Go中main函数不支持任何返回值
    通过os.Exit来返回状态
    
    通过os.Args获取命令行参数
     */
    func main()  {
    	fmt.Println(os.Args)
    	if len(os.Args)>1{
    		fmt.Println("Hello World",os.Args[1])
    	}
    	//os.Exit(0)
    	os.Exit(-1)
    }
    

    ch2

    package try_test
    
    import "testing"
    
    /**
    1. 源码⽂件以 _test 结尾: xxx_test.go
    2. 测试⽅法名以 Test 开头: func TestXXX(t *testing.T) {…}
    参数为t *testing.T的指针
    */
    
    func TestFirstTry(t *testing.T) {
    	t.Log("My first test")
    }
    
    

    斐波纳挈数列

    package fib
    
    import (
    	"testing"
    )
    
    func TestFibList(t *testing.T) {
    	//var a int = 1
    	//var b int = 1
    	//var(
    	//	a int =1
    	//	b =1
    	//)
    	a := 1
    	b := 1
    	//fmt.Println(a,"")
    	t.Log(a)
    	for i := 0; i < 5; i++ {
    		//fmt.Println("",b)
    		t.Log(b)
    		tmp := a
    		a = b
    		b = tmp + a
    	}
    	//fmt.Println()
    }
    
    /**
    go 中可以直接交换值
     */
    func TestFibList2(t *testing.T) {
    	a, b := 0, 1
    	t.Log(b)
    	for i := 0; i < 5; i++ {
    		a, b = b, a+b
    		t.Log(b)
    	}
    
    }
    
    

    常量

    package constant_test
    
    import "testing"
    
    /**
    go 连续常量赋值及按比特位连续赋值
    */
    const (
    	Monday = iota + 1
    	Tuesday
    	Wednesday
    )
    /**
    常量按比特位赋值,第一位为1,第二位为1..
     */
    const (
    	Readable = 1 << iota
    	Writable
    	Executable
    )
    
    func TestConstantTry(t *testing.T) {
    	t.Log(Monday, Tuesday)
    }
    
    func TestConstantTry1(t *testing.T)  {
    	a:=1 //0001
    	t.Log(a&Readable==Readable,a&Writable==Writable,a&Executable==Executable)
    }
    

    ch3

    类型装换

    package type_test
    
    import "testing"
    
    /**
    go的基本数据类型
    隐式类型转换
    */
    
    //定义自己的类型
    type MyInt int64
    
    func TestImplicit(t *testing.T) {
    	//隐式类型转换报错
    	var a int32 = 1
    	var b int64
    	//b = a
    	//t.Log(a, b)
    
    	//别名也无法进行隐式类型转换 只能使用显示类型转换 c=MyInt(b)
    	b = int64(a)
    	var c MyInt
    	//c = b
    	c = MyInt(b)
    	t.Log(a, b, c)
    }
    
    /**
    go 指针
    */
    func TestPoint(t *testing.T) {
    	a := 1
    	aPtr := &a
    	//go指针不能进行运算
    	//aPtr = aPtr + 1
    	t.Log(a, aPtr)
    	t.Logf("%T %T", a, aPtr)
    }
    
    /**
    go 中初始化string时为空字符串
     */
    func TestString(t *testing.T)  {
    	//go 中空判断为nil
    	var s string
    	//判断空字符传为
    	if s==""{
    		t.Log(s)
    	}
    	t.Log("*"+s+"*")
    	t.Log(len(s))
    }
    

    ch4

    按位操作

    package operator_test
    
    import "testing"
    
    /**
    在go中 数组长度一致可以直接==比较
    */
    
    func TestCompareArray(t *testing.T) {
    	a := [...]int{1, 2, 3, 4}
    	b := [...]int{1, 2, 3, 5}
    	//c:=[...]int{1,2,3,4,5}
    	d := [...]int{1, 2, 3, 4}
    	e := [...]int{1, 3, 2, 4}
    
    	t.Log(a == b)
    	//长度不同无法比较
    	//t.Log(a==c)
    	t.Log(a == d)
    	//长度相同,内容相同,顺序不同 返回false
    	t.Log(a == e)
    }
    
    /**
    &^ 按位清零运算符
    当右侧数为1时返回0
    当右侧数为0时返回左侧数
    1 &^ 0 -- 1
    1 &^ 1 -- 0
    0 &^ 1 -- 0
    0 &^ 0 -- 0
    */
    
    const (
    	Readable = 1 << iota
    	Writable
    	Executable
    )
    
    func TestBitClear(t *testing.T) {
    	a:=7 //0111
    	a = a&^Readable
    	t.Log(a)
    	t.Log(a&Readable==Readable,a&Writable==Writable,a&Executable==Executable)
    }
    
    

    ch5

    循环与条件

    package condition__test
    
    import "testing"
    
    /**
    go的条件语句中 必须是boolen值
    函数支持多返回值
    */
    func TestIfMultiSec(t *testing.T) {
    	if a := 1 == 1; a {
    		t.Log("1=1")
    	}
    	//多返回值处理
    	//if v, err := someFunc(); err == nil {
    	//	t.Log("2==2")
    	//} else {
    	//	t.Log("1==1")
    	//}
    
    }
    
    /**
    switch条件
    1. 条件表达式不限制为常量或者整数;
    2. 单个 case 中,可以出现多个结果选项, 使⽤逗号分隔;
    3. 与 C 语⾔等规则相反, Go 语⾔不需要⽤break来明确退出⼀个 case;
    4. 可以不设定 switch 之后的条件表达式,在此种情况下,整个 switch 结
    构与多个 if…else… 的逻辑作⽤等同
    */
    func TestSwitchMultiCase(t *testing.T) {
    	for i := 0; i < 5; i++ {
    		switch i {
    		case 0, 2:
    			t.Log("EVEN")
    		case 1, 3:
    			t.Log("ODD")
    		default:
    			t.Log("It is not 0-3")
    
    		}
    	}
    }
    
    func TestSwitchCaseCondition(t *testing.T) {
    	for i := 0; i < 5; i++ {
    		switch {
    		case i%2 == 0:
    			t.Log("EVEN")
    		case i%2 == 1:
    			t.Log("ODD")
    		default:
    			t.Log("It is not 0-3")
    
    		}
    	}
    }
    
    func TestSwitchCaseCondition1(t *testing.T) {
    	for i := 0; i < 5; i++ {
    		switch {
    		case i&1 == 0:
    			t.Log("EVEN")
    		case i&1 == 1:
    			t.Log("ODD")
    		default:
    			t.Log("It is not 0-3")
    
    		}
    	}
    }
    
    
    package loop__test
    
    import "testing"
    
    /**
    循环
    */
    func TestWhileLoop(t *testing.T) {
    	//条件循环
    	n := 0;
    	for n < 5 {
    		t.Log(n)
    		n++
    	}
    	//无限循环
    	for {
    		t.Log(n)
    	}
    }
    
    

    ch6

    数组与分片

    package array_test
    
    import "testing"
    
    /**
    var a [3]int //声明并初始化为默认零值
    a[0] = 1
    b := [3]int{1, 2, 3} //声明同时初始化
    c := [2][2]int{{1, 2}, {3, 4}} //多维数组初始化
     */
    func TestArrayInit(t *testing.T) {
    	var arr [4] int
    	arr1 := [4] int{1, 2, 3, 5}
    	arr3 := [...]int{1, 2, 3, 4}
    	arr[1] = 5
    	t.Log(arr[1], arr[2])
    	t.Log(arr1, arr3)
    }
    
    /**
    遍历数组
     */
    
    func TestArrayTravel(t *testing.T) {
    	arr3 := [...]int{1, 2, 3, 4}
    	for i := 0; i < len(arr3); i++ {
    		t.Log(arr3[i])
    	}
    
    	for idx/*索引*/, e/*元素*/ := range arr3 {
    		t.Log(idx, e)
    	}
    	//当不需要返回索引时,需要用下划线占位
    	for _,e:=range arr3{
    		t.Log(e)
    	}
    }
    
    /**
    数组截取
    a[开始索引(包含), 结束索引(不包含)]
    
    a := [...]int{1, 2, 3, 4, 5}
    a[1:2] //2
    a[1:3] //2,3
    a[1:len(a)] //2,3,4,5
    a[1:] //2,3,4,5
    a[:3] //1,2,3
     */
    func TestArraySection(t *testing.T)  {
    	arr3:=[...]int{1,2,3,4,5}
    	arr3_sec :=arr3[:3]
    	t.Log(arr3_sec)
    	//go中不支持从后向前取值
    	//arr3_sec1 :=arr3[:-1]
    }
    
    package slice_test
    
    import "testing"
    
    /**
    切片,类似可变长的数组
    内部结构:
    	ptr *Elem指针,指向一个连续空间数组
    	len int:元素的个数
    	cap int:内部数组的容量
    */
    
    func TestSliceInit(t *testing.T) {
    	var s0 [] int
    	t.Log(len(s0), cap(s0))
    
    	s0 = append(s0, 1)
    	t.Log(len(s0), cap(s0))
    
    	s1 := []int{1, 2, 3, 4}
    	t.Log(len(s1), cap(s1))
    
    	//使用make初始化数组,第一个参数为类型,第二为长度len,第三个为容量cap
    	s2 := make([]int, 3, 5)
    	t.Log(len(s2), cap(s2))
    	//此时报错 index out of range [3] with length 3
    	//t.Log(s2[0],s2[1],s2[2],s2[3],s2[4])
    	t.Log(s2[0], s2[1], s2[2])
    	//追加一个元素,len是初始化元素的个数,cap是容量大小
    	s2 = append(s2, 1)
    	t.Log(s2[0], s2[1], s2[2], s2[3])
    	t.Log(len(s2), cap(s2))
    }
    
    /**
    切片的扩容效果,cap增长因子是*2
    cap:capacity
    */
    func TestSliceGrowing(t *testing.T) {
    	s := []int{}
    	for i := 0; i < 10; i++ {
    		//数组append的时候需要重新赋值,cap在增长后会赋值
    		s = append(s, i)
    		t.Log(len(s), cap(s))
    	}
    }
    
    /**
    切片共享存储结构
    */
    func TestSliceShareMemory(t *testing.T) {
    	year := []string{"Jan", "Feb", "Mar", "Apr", "Mar", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
    	Q2 := year[3:6]
    	t.Log(Q2, len(Q2), cap(Q2))
    
    	summer := year[5:8]
    	t.Log(summer, len(summer), cap(summer))
    	summer[0] = "Unknow"
    	t.Log(Q2)
    }
    
    /**
    数组 vs. 切⽚
    1. 容量是否可伸缩
    2. 是否可以进⾏⽐较
    	切片不能比较只能判断是否为nil
    */
    func TestSliceComparing(t *testing.T) {
    	a := []int{1, 2, 3, 4}
    	b := []int{1, 2, 3, 4}
    	// invalid operation: a == b (slice can only be compared to nil)
    	//if a == b {
    	//	t.Log("equal")
    	//}
    }
    
    
  • 相关阅读:
    TP框架对数据库的操作
    Nginx的安装及配置
    微信小程序的入门
    MySQL的多表联查
    Larave中CSRF攻击
    Linux(三)
    Linux(二)
    Linux(一)
    安全测试检查项
    mysql-视图及索引简介
  • 原文地址:https://www.cnblogs.com/GYoungBean/p/13636199.html
Copyright © 2011-2022 走看看