从0开始学Go(一)

文章目录

  • 这是我的Golang学习笔记
    • 1. 运行 go 程序:go run xxx.go
    • 2. 标识符的私有化
    • 3. 函数
      • 3.1 自定义函数类型
      • 3. 2 go支持多返回值函数
        • 3.2.1 下面是基础版本示例
        • 3.2.2 进阶版
        • 3.2.3 返回值命名
      • 3.3 可变参数
      • 3.4 defer语句
      • 3.5 匿名函数
      • 3.6 内置函数
      • 3.7 递归函数
    • 4. 不能将源文件命名为 xxx_test.go
    • 5. Windows不支持`go run *.go`的写法
    • 6. go 不支持任何函数之外存在执行语句
    • 7. 包别名语法
    • 8. init函数
    • 9. 关于包的导入
      • 9.1 普通的导入包的语句:
      • 9.2 只想使用某个包中的初始化动作
      • 9.3 直接使用某个包中的变量/函数
      • 9.4 包的名称与其所在目录不一致
    • 10. 常量
    • 11. 每个包都要独占一个目录
    • 12. 数据类型
    • 13. 格式化输出控制符
    • 14. strings的基本使用
      • 14.1 strings.HasPrefix(s string, prefix string) bool
      • 14.2 strings.HasSuffix(s string, suffix string) bool
      • 14.3 strings.Index(s string, str string) int
      • 14.4 strings.LastIndex(s string, str string) int
      • 14.5 strings.Replace(str string, old string, new string, n int) string
      • 14.6 strings.Count(str string, substr string) int
      • 14.7 strings.Repeat(str string, count int) string
      • 14.8 strings.ToLower(str string) string
      • 14.9 strings.ToUpper(str string) string
      • 14.10 ...
      • 14.11 Go遍历含中文的字符串并输出
    • 15. strconv 包的基本使用
    • 16. 时间和日期类型
      • 16.1 func (t Time) Format(layout string) string
    • 17. 流程控制
      • 17.1 if/else
      • 17.2 普通switch case
      • 17.3 条件switch case
      • 17.4 for
      • 17.5 for range
      • 17.6 goto/continue/break 和 label
    • 18. 数组和切片
      • 18.1 数组
      • 18.2 编译器自动确定数组大小
      • 18.3 将数组指定位置的元素初始化成指定的值(其余位置初始化为0)
      • 18.4 数组的复制和传递
      • 18.5 可以通过指针直接访问数组元素
      • 18.6 切片
      • 18.7 切片的追加
      • 18.8 通过数组切片创建切片
      • 18.9 使用make创建切片
      • 18.10 用代码证明,切片在参数传递过程中是一种浅拷贝的值传递
      • 18.11 数组和切片的展开(解包)
    • 19. 错误
      • 19.1 errors包的基本使用
    • 20. 使用 goroute 实现并发
    • 21. 闭包
    • 22. 关于排序
      • 22.1 sort包对切片进行排序
      • 22.2 sort包对数组进行排序

这是我的Golang学习笔记

所有项目均为Windows + VSCode + go环境下创建

这并不是一篇从完全意义上的小白开始学习的博文,看这篇博文之前还是需要一丁点的go的知识点的,比如第一个Golang程序“HelloGo”怎么写等等,甚至包括环境搭建啥的,这种我就不写了,毕竟随便一搜索就是大把的资料。


1. 运行 go 程序:go run xxx.go

// Hello Go
package main

import (
	"fmt"
)

func main() {
   
	fmt.Printf("Hello Go")
}

2. 标识符的私有化

如果想要在外部调用某个包内部的函数/变量,需要命名时首字母大写

3. 函数

func funcName(FormalParameterList) ReturnValueList {
	FuncBody
}
func add(a int, b int) int {
   
	return a + b
}

3.1 自定义函数类型

type typeName func(FormalParameterList) ReturnValueList

package main

import "fmt"

//type opFunc func(int, int) int
func add(a, b int) int {
   
	return a + b
}

//func operator(op opFunc, a, b int) int {
   
func operator(op func(int, int) int, a, b int) int {
   
	return op(a, b)
}

func main() {
   
	c := add
	sum := operator(c, 100, 200)
	fmt.Println(sum)
}
/*
output:
API server listening at: 127.0.0.1:14310
300
Process exiting with code: 0
*/

3. 2 go支持多返回值函数

返回值列表必须使用“()”括起来

3.2.1 下面是基础版本示例
// base example:
// calc returns the sum and average of two numbers 
func calc(a int, b int)(int, int) {
   
    sum := a + b
    avg := (a + b) / 2
    return sum, avg
}
// usage:
sum, avg = calc(10, 20)
// 如果有部分返回值不使用,可以使用“_”占位
_, avg = calc(10, 20)
3.2.2 进阶版

在定义函数时,直接命名返回值,这样可以在返回时,直接只写一个return

package main

import (
	"fmt"
)

// getPerimeterArea returns the circumference and area of a rectangle
func getPerimeterArea(width int, height int) (perimeter int, area int) {
   
	perimeter = width*2 + height*2
	area = width * height
	return
}

func main() {
   
	//var perimeter, area = getPerimeterArea(100, 50)
	perimeter, area := getPerimeterArea(100, 50)
	fmt.Println("The rectangle's perimeter is: ", perimeter, ", area is: ", area)
}
/*
output:
API server listening at: 127.0.0.1:8161
The rectangle's perimeter is:  300 , area is:  5000
Process exiting with code: 0
*/
3.2.3 返回值命名

单返回值参数也可以命名,一旦命名,不论是单返回值还是多返回值,都必须使用“()”括起来

3.3 可变参数

func FuncName1(arg...int) int {
    // 0个或多个参数
}

func FuncName2(a int, arg...int) int {
    // 1个或多个参数
}

func FuncName3(a int, b int, arg...int) int {
    // 2个或多个参数
}
package main

import (
	"fmt"
)

func add(a int, arg ...int) int {
   
	var sum int = a
	for i := 0; i < len(arg); i++ {
   
		sum += arg[i]
	}
	return sum
}

func addString(a string, arg ...string) (result string) {
   
	result = a
	for i := 0; i < len(arg); i++ {
   
		result += arg[i]
	}
	return
}

func main() {
   
	sum := add(10)
	fmt.Println(sum)
	result := addString("Hello", " ", "Go", "!")
	fmt.Println(result)
}
/*
output:
API server listening at: 127.0.0.1:42029
10
Hello Go!
Process exiting with code: 0
*/

3.4 defer语句

  • 当函数返回时,自动执行 defer 语句,因此可以用来清理资源
  • 多个 defer 语句,按先进后出的方式执行
  • defer 中的语句,在 defer 声明时就已经决定了
package main

import (
	"fmt"
)

func main() {
   
	var i int = 0
	defer fmt.Println("i = ", i)
	i++
	for j := 0; j < 3; j++ {
   
		defer fmt.Println("j = ", j)
	}
}
/*
output:
API server listening at: 127.0.0.1:2584
j =  2
j =  1
j =  0
i =  0
Process exiting with code: 0
*/

3.5 匿名函数

package main

import (
	"fmt"
)

func test(a, b int) int {
   
	result := func(a1, b1 int) int {
   
		return a1 + b1
	}(a, b)	//此处使用小括号说明在定义这个匿名函数的同时调用了它
	return result
}

func main() {
   
	fmt.Println(test(100, 300))
}
/*
output:
API server listening at: 127.0.0.1:32747
400
Process exiting with code: 0
*/

3.6 内置函数

不需要导入任何包也不需要定义就可以直接使用的函数

函数名 功能
close 主要用来关闭channel
len 用来求长度,比如string、arrav、slice、map、channel
new 用来分配内存,主要用来分配值类型,比如int、struct
make 用来分配内存,主要用来分配引用类型,比如chan、map、slice
append 用来追加元素到数组、slice中
copy 拷贝
panic和recover 用来做错误处理
//new
package main

import (
	"fmt"
)

func main() {
   
	a := new(int)
	*a = 100
	fmt.Println(a)
	fmt.Println(*a)
}
/*
output:
API server listening at: 127.0.0.1:47147
0xc0000120b8
100
Process exiting with code: 0
*/
//make
package main

import (
	"fmt"
)

func main() {
   
	pipe :=

你可能感兴趣的:(Go学习笔记,go)