【一】Go 學習筆記

易山博客地址java

全部的代碼都在這裏了 ↑,內附了github地址,能夠直接下載!node

github地址: 點擊跳轉代碼下載(這裏直接跳轉也能夠)python


1.變量的認識

package main

import "fmt"


// 他能夠自動檢測類型
// 外部聲明不能夠使用 := 必須聲明var
var (
	aa = true
    bb = 123
    cc = "string"
    
)

func variableZeroValue () {
    // 能夠這麼聲明變量
	var a int
	var s string
	fmt.Printf("%d %q\n",a,s)
}

func variableInitValue() {
    // 也能夠這樣
	var a,b int = 3,4
	var s string = "abc"
	fmt.Println(a,b,s)
}

func variableTypeDeduction() {
    // 也能夠這樣
	var a,b,c,d = 3,4,true,"def"
	var s = "abc"
	fmt.Println(a,b,c,d,s)
}

func variableShorter() {
    // 也能夠這樣
	a,b,c,d := 1,2,true,"string"
	fmt.Println(a,b,c,d)
}

func main() {
    // 主函數操做以下
	fmt.Println("Hello, World!")
	variableZeroValue()
	variableInitValue()
	variableTypeDeduction()
	variableShorter()
}

vscode 打印以下:

C:go\src\google_go>go run basic.go
Hello, World!
0 ""
3 4 abc
3 4 true def abc
1 2 true string
複製代碼

2.內置對象的認識

package main

import "fmt"

// 內置變量類型
// bool , string
// (u)int(整形),(u)int8,(u)int16,(u)int32(4字節),(u)int64,uintptr
// byte(8字節) , rune(32字節)
// float32,float64(浮點數) ,complex64,complex128(複數)

// 強制類型轉換(都是強制類型轉換)
// var a,b int = 3,4
// var c int
// c = int(math.Sqrt(float64(a*a+b*b)))

// 枚舉

func enums() {
	// iota 自增
	const (
		java = iota
		javaScript
		g0
	)
	fmt.Println(java,javaScript,g0)
	const (
		b = 1 << (10 * iota)
		kb
		cb
	)
	fmt.Println(b,kb,cb)
}

// 常量

func main() {
	const name = "shan_yi"
	const age = 22
	fmt.Println(name,age)
	enums()
}

vscode 控制檯打印
C:\go\src\google_go>go run 2typeof.go
shan_yi 22
0 1 2
1 1024 1048576

複製代碼

3.if-else

package main

import "fmt"

// if else
func main() {
	aa := 1
	bb := 2
	// 第一種寫法
	// err := true
	// if err {
	// fmt.Println(aa)
	// } else {
	// fmt.Println(bb)
	// }
	// 第二種寫法(寫法比較傻haha。。。)
	if err := true; err {
		fmt.Println(aa)
	} else {
		fmt.Println(bb)
	}
}

複製代碼

4.switch

package main

import "fmt"

// 咱們不須要寫break;
// 系統自動break;
func main() {
	a := 60
	call := ""
    
	switch  {
	case a < 60:
		call = "E"
	case a < 70:
		call = "D"
	case a < 80:
		call = "C"
	case a < 90:
		call = "B"
	case a < 100:
		call = "A"
	default:
		panic(fmt.Sprintf("Error: %d", a))
	}
	fmt.Println(call)
}

// D

複製代碼

5.for

package main

import "fmt"

func main() {
	num := 0
	for i:=0;i<=100;i++{
		num += i
	}
	fmt.Println(num)
}

// 5050
複製代碼

6.函數

package main

import (
	"fmt"
	"math"
	"reflect"
	"runtime"
)

func eval(a , b int, op string) int {
	switch op {
	case "+":
		return a + b
	case "-":
		return a - b
	default:
		panic("error:" + op)
	}
}

func apply(op func(int, int) int, a, b int) int {
	p := reflect.ValueOf(op).Pointer()
	opName := runtime.FuncForPC(p).Name()
	fmt.Printf("call function %s with args (%d, %d)",opName,a,b)
	return op(a, b)
}

func div(a,b int) (c,d int) {
	return a / b, a % b
}

func pow(a,b int) int {
	return int(math.Pow(float64(a), float64(b)))
}

// 可變參數
func sum(numbers ...int) int {
	s := 0
	for i := range numbers {
		s += numbers[i]
	}
	return s
}

func main() {
	fmt.Println(eval(1,2,"+"))
	c, d := div(23,5)
	fmt.Println(c, d)
	fmt.Println(apply(pow,3,4))
	fmt.Println(sum(1,2,3,4,5))
}
複製代碼

7.指針

package main

import "fmt"

// 值傳遞 沒有引用傳遞 -> 指針修改
//func swap(a,b *int) {
// *b, *a = *a, *b
//}
//
//func main() {
// a,b := 3,4
// swap(&a, &b)
// fmt.Println(a,b)
//}

// 換一種方式交換兩個的值
func swap(a,b int) (int, int) {
	return b, a
}

func main() {
	a,b := 3,4
	a,b = swap(a, b)
	fmt.Println(a,b)
}
複製代碼

8.數組的認識

package main

import "fmt"

func printArray(arr [5]int) {
	// 值類型數組
	for i, v:= range arr{
		fmt.Println(i,v)
	}
}

func main()  {
	// 數組值類型
	var arr1 [5]int
	arr2 := [3]int{1,2,3}
	// ... 編譯器來決定個數
	arr3 := [...]int{2,4,6,8,10}
	fmt.Println(arr1,arr2,arr3)
	// 二維數組
	// 4個數組,5個內容
	var grid [4][5]int
	fmt.Println(grid)
	//[0 0 0 0 0] [1 2 3] [2 4 6 8 10]
	//[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]

	// 測試循環
	//for i:= 0; i < len(arr3);i++ {
	// fmt.Println(arr3[i])
	//}
	//2
	//4
	//6
	//8
	//10

	// or

	// range 獲取數組下標
	// 能夠經過 _ 省略變量
	// 任何地方均可以 使用 _ 省略變量
	//for i, v:= range arr3{
	// fmt.Println(i,v)
	//}
	//0 2
	//1 4
	//2 6
	//3 8
	//4 10


	// range
	// 1. 美觀,意義明確
	// 2. c++:沒有相似功能
	// 3. java/python:只能for each value,不能同時得到 i,v

	printArray(arr1)
}
複製代碼

9.切片

package main

import "fmt"

func updateSlice(arr []int) {
	arr[0] = 100
}

func main()  {
	arr := [...]int{0,1,2,3,4,5,6,7}
	fmt.Println("dataArray:",arr[2:6])
	//dataArray: [2 3 4 5]
	fmt.Println("dataArray:",arr[2:])
	//dataArray: [2 3 4 5 6 7]
	fmt.Println("dataArray:",arr[:6])
	//dataArray: [0 1 2 3 4 5]
	fmt.Println("dataArray:",arr[:])
	//dataArray: [0 1 2 3 4 5 6 7]

	//Reslice
	a1 := arr[2:]
	updateSlice(a1)
	fmt.Println(a1)
	//[100 3 4 5 6 7]
	fmt.Println(arr)
	//[0 1 100 3 4 5 6 7]

	// slice 底層view 向後擴展
	// [3,6]
	// [3,4]
	//arr := o,1,2,3,4,5,6,7
    
    arr1 := append(a1, 8)
	arr2 := append(arr1, 9)
	arr3 := append(arr2, 10)
	fmt.Println(arr1,arr2,arr3,arr)
	//[100 3 4 5 6 7 8] [100 3 4 5 6 7 8 9] [100 3 4 5 6 7 8 9 10] [0 1 100 3 4 5 6 7]

}

複製代碼

10.slice 操做

package main

import "fmt"

func printSlice(s []int) {
	fmt.Println(len(s),cap(s))
}

func main() {
	var s []int // zero value for slice is nil
	for i:= 0;i<10;i++{
		s = append(s, 2*i+1)
	}
	fmt.Println(s)
	//[1 3 5 7 9 11 13 15 17 19]
	printSlice(s)
	//10 16
	s1 := make([]int,10,16)
	printSlice(s1)
	//10 16
	copy(s1, s)
	fmt.Println(s1)
	//[1 3 5 7 9 11 13 15 17 19]

}

複製代碼

11.map

package main

import "fmt"

func main() {
	m := map[string]string{
		"name": "shan_Yi",
		"age": "1997",
		"sex": "男",
	}
	fmt.Println(m)

	m2:=make(map[string]int) // empty map
	var m3 map[string]int // nil
	fmt.Println(m2,m3)
	//map[] map[]

	for k,v := range m {
		fmt.Println(k,v)
	}
	// map hash map 無序

	// 若是沒有存在key 則爲 zero value
	if causeName, ok := m["colors"]; ok {
		fmt.Println(causeName)
	} else {
		fmt.Println("key does not exist")
	}

	fmt.Println("delete values")
	name, ok := m["name"]
	fmt.Println(name,ok)
	delete(m,"name")
	name, ok = m["name"]
	fmt.Println(name,ok)
    
    // golang 控制檯
    //map[age:1997 name:shan_Yi sex:男]
    //map[] map[]
    //name shan_Yi
    //age 1997
    //sex 男
    //key does not exist
    //delete values
    //shan_Yi true
    // false
}

複製代碼

12. map_

package main

import "fmt"

func lengthOfNonRepeatingSubStr(s string) int {
	// byte 英文字符 阿斯克碼
	lastOccurred := make(map[byte]int)
	start := 0
	maxLength := 0
	for i,ch := range []byte(s) {

		if lastI,ok := lastOccurred[ch]; ok && lastI >= start {
			start = lastI + 1
		}
		if i - start + 1 > maxLength {
			maxLength = i - start + 1
		}
		lastOccurred[ch] = i
	}
	return  maxLength
}

func main() {
	// 尋找最長不含有重複字符的子串
	fmt.Println(lengthOfNonRepeatingSubStr("abcabcbb"))
	fmt.Println(lengthOfNonRepeatingSubStr("bbbbbbbb"))
	fmt.Println(lengthOfNonRepeatingSubStr("pwwkew"))
	fmt.Println(lengthOfNonRepeatingSubStr(""))
	fmt.Println(lengthOfNonRepeatingSubStr("b"))
	fmt.Println(lengthOfNonRepeatingSubStr("abcdefg"))
	fmt.Println(lengthOfNonRepeatingSubStr("易山博客測試"))
	fmt.Println(lengthOfNonRepeatingSubStr("一一一二"))
}

golang
3
1
3
0
1
7
11
5
複製代碼

13.string

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	s:= "hello易山"  // UTF-8 english1 china3
	for _,b := range []byte(s) {
		fmt.Printf("%X " , b)
	}
	fmt.Println()

	for i,ch := range s { // ch is a rune
		fmt.Printf("(%d %X)",i,ch)
	}
	fmt.Println()

	fmt.Println(utf8.RuneCountInString(s))
	//68 65 6C 6C 6F E6 98 93 E5 B1 B1
	//(0 68)(1 65)(2 6C)(3 6C)(4 6F)(5 6613)(8 5C71)
	//7
}

複製代碼

14,面向對象

go 語言僅支持封裝,不支持繼承和多態c++

package main

import "fmt"

type treeNoe struct {
	value int
	left,right *treeNoe
}

func (node treeNoe) print() {
	fmt.Print(node.value, " ")
}

func (node *treeNoe) setValue(value int) {
	node.value = value
}

func (node *treeNoe) traverse() {
	if node == nil {
		return
	}
	// 中序便利

	node.left.traverse()
	node.print()
	node.right.traverse()
}

// 公創函數
func createNode(value int) *treeNoe  {
	return &treeNoe{value:value}
}

func main() {
	var root treeNoe
	root = treeNoe{value:3}
	root.left = &treeNoe{}
	root.right = &treeNoe{5, nil,nil}
	root.right.left = new(treeNoe)
	root.left.right = createNode(2)

	nodes := []treeNoe{
		{value:3},
		{},
		{6,nil,nil},
	}

	fmt.Println(root,"\n",nodes)

	root.right.left.setValue(4)
	//root.right.left.print()
	//fmt.Println()
	//
	//Proot := &root
	//Proot.print()
	//Proot.setValue(100)
	//Proot.print()
	root.traverse()
}

複製代碼

15.包和封裝

16.擴充已有類型

17.接口的實現

18.實現簡單的一個接口請求

19.函數式編程閉包

package main

import "fmt"

func adder() func(int) int {
	sum := 0
	return func(v int) int {
		sum += v
		return sum
	}
}

type iAdder func(int) (int, iAdder) func adder2(base int) iAdder {
	return func(v int) (int, iAdder) {
		return base + v, adder2(base + v)
	}
}

func main() {
	//a := adder()
	//for i:=0;i<10;i++{
	// fmt.Println(a(i))
	//}

	a := adder2(0)
	for i:=0;i<10;i++ {
		var s int
		s, a = a(i)
		fmt.Printf("%d\n", i, s)
	}
}


複製代碼

20.斐波那契數列(閉包)

​ 這裏就放一張我在 力扣 作的解答題git

21.服務器統一處理

當咱們啓動服務的時候就是這樣的(正確的)github

錯誤的golang

Blog: 易山博客編程

版權:本文僅限學習,不涉及商業學習(轉載需註明出處)數組

出處:易山博客 URL:https:ladies.ren/服務器

相關文章
相關標籤/搜索