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)