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")
    	//}
    }
    
    
  • 相关阅读:
    codeforces 455B A Lot of Games(博弈,字典树)
    HDU 4825 Xor Sum(二进制的字典树,数组模拟)
    hdu 1800 Flying to the Mars(简单模拟,string,字符串)
    codeforces 425A Sereja and Swaps(模拟,vector,枚举区间)
    codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)
    HDU 4148 Length of S(n)(字符串)
    codeforces 439D Devu and Partitioning of the Array(有深度的模拟)
    浅谈sass
    京东楼层案例思维逻辑分析
    浅谈localStorage和sessionStorage
  • 原文地址:https://www.cnblogs.com/GYoungBean/p/13636199.html
Copyright © 2011-2022 走看看