Go学习完结

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go学习完结相关的知识,希望对你有一定的参考价值。

Go学习完结

  • Google开源
  • 编译型语言
  • 21世纪的语言(2007)

0.HelloWord

创建一个名为:hello.go 的文件,这里.go 是go类型的文件的后缀。

package main 

import "fmt"

func main(){
	fmt.Printf("Hello World!");
}

然后打开cmd进入该文件的目录下:输入go bulid hello.go

windows下会在该目录下生成一个名为:hello.exe的文件。

我们再在cmd下输入hello 即可看到打印信息。

特点

语法简洁,开发效率高,执行性能好。

使用

使用Go的fmt格式化工具,在GoLand下的设置:

Settings->File Watchers -> 添加go fmt 即可。


学习

1.声明与赋值、变量与常量

Go语言声明的变量必须使用,变量声明用var。

var name string //单独声明
var age int
var isOk bool

//批量声明
var(
	name string
    age int
    isOk bool
)
const mo string = "1234"
cosnt m = "12345"
const(
	c1 = 1
    c2 = 1.5
    c3 = "abc"
)
var name string = "herio" //声明同时赋值
var name = "herio" //自动推导类型
name := "herio" //简短变量声明,只能在函数中使用

Go 有众所周知的类型如 int,这个类型根据你的硬件决定适当的长度。意味着在 32 位硬件上,是 32 位的;在 64 位硬件上是 64 位的。注意:int 是 32 或 64 位之一,不会定义成其他值。uint 情况相同。

如果你希望明确其长度,你可以使用 int32 或者 uint32。完整的整数类型列表(符号和无符号)是 int8 , int16 , int32 , int64 和 byte , uint8 , uint16 , uint32 ,uint64 。byte 是 uint8 的别名。浮点类型的值有 float32 和 float64 (没有 float 类型)。64 位的整数和浮点数 总是 64 位的,即便是在 32 位的架构上。


2.输出

Println换行打印,Printf 格式化输出,Print不换行打印。


3.常量计数器iota

package main

import "fmt"

const (
	a1 = iota //常量计数器
	a2
	a3
	a4
)

func main() {
	fmt.Print(a1)
	fmt.Print(a2)
	fmt.Print(a3)
	fmt.Print(a4)
}

//0123

//辨析
const(
	a1 = iota //0
	a2 = _  //1
	a3 = iota //2
	a4	//3
)

const(
	a1,a2= iota ,iota+1  // 0 ,1
    a3,a4= iota+2, iota+3 // 3,4
)

	const (
		a = iota  //0
		b  // 1
		c  // 2
	)

4.数据类型

输出变量可以用%v,打印类型可以用%T

打印多行字符串可以用反引号 ` 输出,反引号的字符串是原义输出,不会转义。

在 Go 中字符串是不可变的。


复数

	s := 5 + 4i
	fmt.Printf("%T %v\\n", s, s)
	fmt.Print(s)
/*
complex128 (5+4i)
(5+4i)
*/

运算符

虽然 Go 不支持运算符重载(或者方法重载),而一些内建运算符却 支持 重载。例如 +
可以用于整数、浮点数、复数和字符串(字符串相加表示串联它们)。

关键字


5.if与for循环、switch、goto

与C类似就是C去掉括号,for range 就是类似for each。

continue与break 与C类似。

Flag:
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j > 5 {
				break Flag
			}
			fmt.Printf("j=%d\\n", j)
		}
	}
	fmt.Println("over")
/*
j=0
j=1
j=2
j=3
j=4
j=5
over
*/
package main

import "fmt"

func main() {
	a := 10
	if a > 10 {
		fmt.Println("a>10")
	} else {
		fmt.Println("a<=10")
	}

	for i := 0; i < 10; i++ {
		fmt.Println(i)
	}

	s := "Herio my boy"
	for i, c := range s {
		fmt.Printf("%d : %c\\n", i, c)
	}
}
/*
a<=10
0
1
2
3
4
5
6
7
8
9
0 : H
1 : e
2 : r
3 : i
4 : o
5 :  
6 : m
7 : y
8 :  
9 : b
10 : o
11 : y
*/

switch 和goto与C类似

package main
import "fmt"
func main() {
    var num1 int = 100
    switch num1 {
    case 98, 99:
        fmt.Println("It's equal to 98")
    case 100: 
        fmt.Println("It's equal to 100")
    default:
        fmt.Println("It's not equal to 98 or 100")
    }
}

6.数组和切片


package main

import "fmt"

func main() {
	a := [...]int{1, 1, 4, 5, 1, 4}
	fmt.Println(a)
	fmt.Printf("%T\\n", a)

	var b [3][2]int
	b = [3][2]int{
		{1, 2},
		{3, 4},
		{5, 6},
	}
	fmt.Println(b)
}
/*
[1 1 4 5 1 4]
[6]int
[[1 2] [3 4] [5 6]]
*/

用 make() 创建一个切片

当相关数组还没有定义时,我们可以使用 make() 函数来创建一个切片 同时创建好相关数组:var slice1 []type = make([]type, len)

也可以简写为 slice1 := make([]type, len),这里 len 是数组的长度并且也是 slice 的初始长度。

所以定义 s2 := make([]int, 10),那么 cap(s2) == len(s2) == 10

make 接受 2 个参数:元素的类型以及切片的元素个数。

如果你想创建一个 slice1,它不占用整个数组,而只是占用以 len 为个数个项,那么只要:slice1 := make([]type, len, cap)

make 的使用方式是:func make([]T, len, cap),其中 cap 是可选参数。

所以下面两种方法可以生成相同的切片:

  1. make([]int, 50, 100)
  2. new([100]int)[0:50]


声明一个map

	mp := make(map[string]int)
	mp["herio"] = 123
	fmt.Printf("%d\\n", mp["herio"])
	val, ok := mp["herio"]
	fmt.Print(val, ok)
/*
123
123 true
*/

7.指针

package main

import "fmt"

func main() {
   var a int= 20   /* 声明实际变量 */
   var ip *int        /* 声明指针变量 */

   ip = &a  /* 指针变量的存储地址 */

   fmt.Printf("a 变量的地址是: %x\\n", &a  )

   /* 指针变量的存储地址 */
   fmt.Printf("ip 变量储存的指针地址: %x\\n", ip )

   /* 使用指针访问值 */
   fmt.Printf("*ip 变量的值: %d\\n", *ip )
}
a 变量的地址是: 20818a220
ip 变量储存的指针地址: 20818a220
*ip 变量的值: 20

Go 空指针

当一个指针被定义后没有分配到任何变量时,它的值为 nil。

nil 指针也称为空指针。

nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。

一个指针变量通常缩写为 ptr。

查看以下实例:

package main

import "fmt"

func main() {
   var  ptr *int

   fmt.Printf("ptr 的值为 : %x\\n", ptr  )
}
ptr 的值为 : 0

函数

延迟代码


函数作为值

恐慌Panic和恢复(Recover)

三、包

cmd下查看go的环境配置env:

go env

C:\\Program Files\\Go\\src

这里存放了所有的包。

自定义包:even.go

package even

func Even(i int) bool {
	return i % 2 == 0
}

func odd(i int)bool {
	return i % 2 == 1
}

这里大写开头的函数才能导出。

C:\\Program Files\\Go\\src 目录下创建一个名为even的文件夹,然后将该文件放入到该目录下。

然后就可以导入该包使用了。

package main

import (
	"even"
	"fmt"
)

func main() {
	a := 10
	fmt.Printf("%d : %v", a, even.Even(a))
}
/*
10 : true
*/

包的文档

一些常见的包

  • fmt 实现格式化I/O函数
  • io 包含原始的I/O操作界面
  • bufio 实现缓冲的I/O
  • sort 排序
  • strconv 字符串与基本数据的转换
  • os 提供了与平台无关的操作系统功能接口
  • sync 基本同步原语
  • flag 命令行解析

四、内存分配


务必记得 make 仅适用于 map,slice 和 channel,并且返回的不是指针。应当用 new 获 得特定的指针。

五、自定义类型

注意首字母大写的字段可以被导出,也就是说,在其他包中可以进行读写。字段名以 小写字母开头是当前包的私有的。包的函数定义是类似的,参阅第 3 章了解更多细节。

六、接口,并发、通讯

待学

参考内容

电子书 https://www.bookstack.cn/read/the-way-to-go_ZH_CN/eBook-07.2.md

视频https://www.bilibili.com/video/BV16E411H7og?p=28

Go中文网:https://studygolang.com/pkgdoc

李文周的博客:https://www.liwenzhou.com/

以上是关于Go学习完结的主要内容,如果未能解决你的问题,请参考以下文章

萌萌家网课代理8马哥高端Go语言百万并发高薪班/微服务/分布式高可用/Go高并发超推荐大佬棒牛 90完结

Go语言系列教程之函数完结篇

golang代码片段(摘抄)

Docker学习完结

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

解决go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘(代码片段