golang

golang学习手册

1,函数定义

func variableZeroValue() {
	var a int
	var s string
	fmt.Printf("%d %q\n",a, s)
}

func variableInitValue() {
	var a, b int = 1, 3
	var s string = "abc"
	fmt.Println(a, b, s)
}

func variableTypeDeduction() {
	var a, b, c, d = 3, 4, "abc", true
	fmt.Println(a, b, c, d)
}

func variableShorter() {
	a, b, c, d := 3, 4, "abc", true
	fmt.Println(a, b, c, d)
}

2,内建变量类型

  • bool,string
  • (u)int,(u)int8,(u)int16,(u)int32,(u)int64,uintptr
  • byte,rune
  • float32,float64,complex64,complex128

3,常量与枚举

func consts() {
	const filename = "abc.txt"
	const a, b = 3 ,4
	var c int
	c = int(math.Sqrt(a*a + b*b))
	fmt.Println(filename, c)
}
func enums() {
	const(
		cpp = iota
		java
		python
		golang
	)
	fmt.Println(cpp, java, python, golang)
	const(
		b = 1 << (10 * iota)
		Kb
		mb
		gb
		tb
		pb
	)
	fmt.Println(b, Kb, mb, gb, tb, pb)
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DIXtrBl0-1611308031477)(golang.assets/image-20210120105236404.png)]

4,条件语句

if

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	const filename = "abc.txt"
	contents, err := ioutil.ReadFile(filename)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Printf("%s\n", contents)
	}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xWo7XsBQ-1611308031479)(golang.assets/image-20210120105749844.png)]

简写方式

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	const filename = "abc.txt"
	if contents, err := ioutil.ReadFile(filename); err != nil {
		fmt.Println(err)
	} else {
		fmt.Printf("%s\n", contents)
	}
}

switch

func grade(score int) string {
	g := ""
	switch {
	case score < 60:
		g = "F"
	case score < 80 :
		g = "C"
	case score < 90 :
		g = "B"
	case score <= 100 :
		g = "A"
	default:
		panic(fmt.Sprintf("分数有问题: %d", score))
	}
	return g
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZgC1scQP-1611308031480)(golang.assets/image-20210120110700826.png)]

5,循环

for

  • 省略初始条件,相当于while
  • 条件都省略,相当于死循环

10进制转2进制

func convertToBin(n int) string {
	result := ""
	for ; n > 0; n /= 2 {
		lsb := n % 2
		result = strconv.Itoa(lsb) + result
	}
	return result
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9tQo8Osx-1611308031481)(golang.assets/image-20210120111323853.png)]

读取txt

func printFile(filename string) {
	file, err := os.Open(filename)
	if err != nil {
		panic(err)
	}
	scanner := bufio.NewScanner(file)

	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WVq6Mh46-1611308031482)(golang.assets/image-20210120111941696.png)]

6,函数

  • 返回值类型写在最后面
  • 可返回多个值
  • 函数作为参数
  • 没有默认参数,可选参数
func eval(a, b int, op string) int {
	switch op {
	case "+":
		return a + b
	case "-":
		return a - b
	case "*":
		return a * b
	case "/":
		return a / b
	default:
		panic("符号有问题:" + op)
	}
}
func main() {
	fmt.Println(eval(3, 4, "+"))
}

7,指针

  • 指针不能运算
  • go语言只有值传递一种方式

交换两个变量的值

import "fmt"

func swap(a, b *int) {
	*b, *a = *a, *b
}

func main() {
	a, b := 3, 4
	swap(&a, &b)
	fmt.Println(a, b)
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sOdzhw6F-1611308031484)(golang.assets/image-20210121100406681.png)]

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)
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YBdi5YsU-1611308031484)(golang.assets/image-20210121100615908.png)]

8,数组

  • [10]int和[20]int是不同类型
  • 调用func f(arr [10]int)会拷贝数组
  • go语言中一般不直接使用数组,一般使用切片
package main

import "fmt"

func main() {
	var arr1 [5]int
	arr2 := [3]int{1, 3, 5}
	arr3 := [...]int{2, 4, 5, 6}
	var grid [4][5]int
	fmt.Println(arr1, arr2, arr3)
	fmt.Println(grid)
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MpX8fugw-1611308031485)(golang.assets/image-20210121100954890.png)]

遍历数组

for i := 0; i < len(arr3); i++ {
		fmt.Println(arr3[i])
	}
	
for i, v := range arr3 {
		fmt.Println(i, v)
	}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YSHTk8Wp-1611308031485)(golang.assets/image-20210121101236666.png)]

为什么要用range:

  • 意义明确,简单美观
  • 大部分语言都有range,c++没有类似能力
  • java/python:只能for each value,不能同时获取i、v

9,切片

  • slice可以向后扩展,不可以向前扩展
  • s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)
  • 添加元素时如果超越cap,系统会重新分配更大的底层数组
  • 由于值传递的关系,必须接收append的返回值
  • s = append(s, val)

创建切片

func printSlice(s []int) {
	fmt.Printf("len=%d, cap=%d\n", len(s), cap(s))
}

func main() {
	var s []int
	for i := 0; i < 100; i++ {
		printSlice(s)
		s = append(s, 2 * i + 1)
	}
	fmt.Println(s)
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TzZ8VFab-1611308031486)(golang.assets/image-20210121110211233.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YqM3OxEn-1611308031486)(golang.assets/image-20210121110224246.png)]

从数组中创建切片

package main

import "fmt"

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5scWCkiQ-1611308031486)(golang.assets/image-20210121102643263.png)]

10,Map

  • map[K]V,pam[K1]map[K2]V
  • 创建:make(map[string]int)
  • 获取元素:m[key]
  • key不存在时,获得value类型的初始值
  • 用value, ok := m[key]来判断是否存在key
  • 用delete删除一个key
  • 使用range遍历key,或者遍历key,value对
  • 不保证遍历顺序,如需顺序,需要手动对key排序
  • 使用len获取元素个数
  • map使用哈希表,必须可以比较相等
  • 除了slice,map,function的内建类型都可以作为key
  • Struct类型不包含上述字段,也可作为key

遍历map

package main

import "fmt"

func main() {
	m := map[string]string {
		"name": "lcc",
		"course": "golang",
		"site": "test",
		"quality": "notbad",
	}
	m2 := make(map[string]int)

	var m3 map[string]int

	fmt.Println(m, m2, m3)

	for k, v := range m {
		fmt.Println(k, v)
	}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-InTWbUmn-1611308031487)(golang.assets/image-20210121111511779.png)]

查询map中的数据

courseName, ok := m["course"]
	fmt.Println(courseName, ok)

	if causeName, ok := m["cause"]; ok {
		fmt.Println(causeName)
	} else {
		fmt.Println("key does not exist")
	}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-muIyuUhI-1611308031487)(golang.assets/image-20210121112120462.png)]

删除map中的数据

delete(m, name)

range m {
fmt.Println(k, v)
}
}


[外链图片转存中...(img-InTWbUmn-1611308031487)]

查询map中的数据

```golang
courseName, ok := m["course"]
	fmt.Println(courseName, ok)

	if causeName, ok := m["cause"]; ok {
		fmt.Println(causeName)
	} else {
		fmt.Println("key does not exist")
	}

[外链图片转存中…(img-muIyuUhI-1611308031487)]

删除map中的数据

delete(m, name)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值