Go Roadmap-Basics中文笔记

Go Roadmap-Basics

地址:https://roadmap.sh/golang
简介:Github star No.6 学习路线 Go 中译版
在这里插入图片描述

Learn the Basics

Go特点:静态类型,运行速度快,编译语言,编译速度快,自动垃圾回收,没有类和对象,没有继承关系。

example:

package main
import ("fmt")func main() {fmt.Println("Hello World!")
}

Basic Syntax

基本语法:包申明、导包、函数、语句。

上面的代码块讲解:

  1. 属于main包
  2. 导入了fmt这个包
  3. 空行更可读
  4. func main(){}是函数
  5. fmt.Println()是fmt包里的函数,可以打印文字。

基本语句:fmt.Println("Hello World!")
敲击enter键就可以结束一行(不用;)
所以:“{”不可以在一行的开头

Variables in Go

最常用变量类型:int float32 string bool

创建变量:

  1. 用var关键字
 var name type = value//不加tpye也可以推断
  1. 用:=标志
name := value

tips:“:=”和auto类似,不分配值的时候不能用。
并且只能在函数内使用。var可以在函数外面。

变量的自动初始化:
string初始为“”
int初始为0
bool初始为false

Data Types

package main
import ("fmt")func main() {var a bool = true     // Booleanvar b int = 5         // Integervar c float32 = 3.14  // Floating point numbervar d string = "Hi!"  // Stringfmt.Println("Boolean: ", a)fmt.Println("Integer: ", b)fmt.Println("Float:   ", c)fmt.Println("String:  ", d)
}

在这里插入图片描述

For Loop

go只有一种循环体,就是for循环。

三内容循环:

sum := 0
for i := 1; i < 5; i++ {sum += i
}
fmt.Println(sum) // 10 (1+2+3+4)

区别在于:没有() 没有int 用的是:=。

while循环:

n := 1
for n < 5 {n *= 2
}
fmt.Println(n) // 8 (1*2*2*2)

无限循环:(没有终止条件)

sum := 0
for {sum++ // repeated forever
}
fmt.Println(sum) // never reached

For-each range循环:

strings := []string{"hello", "world"}
for i, s := range strings {fmt.Println(i, s)
}
0 hello
1 world

String iteration: runes or bytes:

for i, ch := range "日本語" {fmt.Printf("%#U starts at byte position %d\n", ch, i)
}
U+65E5 '日' starts at byte position 0
U+672C '本' starts at byte position 3
U+8A9E '語' starts at byte position 6

Range

在For Loop中

Conditional Statements

if 
if / else 
switch case 
x := trueif x {fmt.Println(s)}
if x == 100 {fmt.Println("Japan")} else {fmt.Println("Canada")}
if x == 50 {fmt.Println("Germany")} else if x == 100 {fmt.Println("Japan")} else {fmt.Println("Canada")}

Errors/Panic/Recover

go不靠stack traces,也不靠try/catch
而是靠函数的值返回,和其他数据类型一样。

Conditional Statements

 if num := 9; num < 0 {fmt.Println(num, "is negative")} else if num < 10 {fmt.Println(num, "has 1 digit")} else {fmt.Println(num, "has multiple digits")}

Functions

问题引入:

定义和声明
返回名
多返回类型
不同的函数类型

函数是为解决特定问题的封装。
有个输入给个输出。

package main
import "fmt"func SimpleFunction() {fmt.Println("Hello World")
}func main() {SimpleFunction()
}

带参数函数:

package main
import "fmt"func add(x int, y int) {total := 0total = x + yfmt.Println(total)
}func main() {// Passing argumentsadd(20, 30)
}

带返回值函数:

package main
import "fmt"func add(x int, y int) int {total := 0total = x + yreturn total
}func main() {// Accepting return value in varaiblesum := add(20, 30)fmt.Println(sum)
}

return返回值可以不写特定变量。

return返回值可以是多值,直接写return就可以。

传地址给函数:

package main
import "fmt"func update(a *int, t *string) {*a = *a + 5      // defrencing pointer address*t = *t + " Doe" // defrencing pointer addressreturn
}func main() {var age = 20var text = "John"fmt.Println("Before:", text, age)update(&age, &text)fmt.Println("After :", text, age)
}Output
Before: John 20
After : John Doe 25

匿名函数:
匿名函数就是没有函数名的函数。

Packages

包就是Go最强大的部分

fmt Package
math Package
string Package

fmt:
在这里插入图片描述print就是输出完不换行,println就是输出完换行。
scanf和printf和C一样,还得指定%d

math:
在这里插入图片描述
sqrt是开根号
cbrt是开三次根

func main() {// find the square rootfmt.Println(math.Sqrt(25))    // 5// find the cube rootfmt.Println(math.Cbrt(27))    // 3// find the maximum numberfmt.Println(math.Max(21, 18))    // 21// find the minimum numberfmt.Println(math.Min(21, 18))    // 18// find the remainderfmt.Println(math.Mod(5, 2))    // 1
}

strings:
在这里插入图片描述在这里插入代码片

package main
import ("fmt""strings")
func main() {lower := strings.ToLower("GOLANG STRINGS")fmt.Println(lower)upper := strings.ToUpper("golang strings")fmt.Println(upper)stringArray := []string{"I love", "Go Programming"}joinedString := strings.Join(stringArray, " ");fmt.Println(joinedString)}
Outputgolang strings
GOLANG STRINGS
I love Go Programming

Type Casting

转化一个类型到另一个类型

i := int(32.987) // 转化到int类型

Go并不支持隐式类型转换(不同于C++)
并且从string转化为int时,可以用strconv包

package main
import ("fmt""strconv"
)
func main() {var s string = "42"v, _ := strconv.Atoi(s)       // convert string to intfmt.Println(v)    // 42var i int = 42str := strconv.Itoa(i)        // convert int to stringfmt.Println(str) // 42
}

Type Inference

尽管时静态类型,却不需要全都初始化定义的变量,
可以自动推断,通过右边的值。

package main
import "fmt"
func main() {// Multiple variable declarations with inferred typesvar firstName, lastName, age, salary = "John", "Maxwell", 28, 50000.0fmt.Printf("firstName: %T, lastName: %T, age: %T, salary: %T\n", firstName, lastName, age, salary)
}# Output
firstName: string, lastName: string, age: int, salary: float64

如果在函数体内,最好还用;=

package main
import "fmt"
func main() {name := "Rajeev Singh"age, salary, isProgrammer := 35, 50000.0, truefmt.Println(name, age, salary, isProgrammer)
}# Output
Rajeev Singh 35 50000 true

Arrays

就是一组相同元素的集合。

package main
import "fmt"func main() {var a [2]stringa[0] = "Hello"a[1] = "World"fmt.Println(a[0], a[1])fmt.Println(a)primes := [6]int{2, 3, 5, 7, 11, 13}fmt.Println(primes)
}
Hello World
[Hello World]
[2 3 5 7 11 13]

Slices

类似于arrays,但是更强大,更灵活。
也是存储多个类型相同的值。
但是slice的长度可以生长和缩小。(形象)

语法:

myslice := []int{}

上述这就是0长度,0容量的slice。
也可以初始化:

myslice := []int{1,2,3}

怎么得到长度和容量呢?
用如下两个函数:len()和cap()

myslice2 := []string{"Go", "Slices", "Are", "Powerful"}fmt.Println(len(myslice2))fmt.Println(cap(myslice2))fmt.Println(myslice2)

上述的len就是4,而cap也是4。

怎么从一个数组创建slice呢?

package main
import ("fmt")func main() {arr1 := [6]int{10, 11, 12, 13, 14,15}myslice := arr1[2:4]fmt.Printf("myslice = %v\n", myslice)fmt.Printf("length = %d\n", len(myslice))fmt.Printf("capacity = %d\n", cap(myslice))
}
Result:myslice = [12 13]
length = 2
capacity = 4

解释:【2:4】指的是左闭右开区间的,所以就是要索引为2和3的数组中的数字,所以长度是2,但是因为切隔切了从2开始后面所有的,所以容量是4。

也可以用make()函数来创建slice:

myslice1 := make([]int, 5, 10)fmt.Printf("myslice1 = %v\n", myslice1)fmt.Printf("length = %d\n", len(myslice1))fmt.Printf("capacity = %d\n", cap(myslice1))

Maps

maps是用于存放键值对组合的,无序。
map的默认值是nil。

package main
import ("fmt")func main() {var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964"}b := map[string]int{"Oslo": 1, "Bergen": 2, "Trondheim": 3, "Stavanger": 4}fmt.Printf("a\t%v\n", a)fmt.Printf("b\t%v\n", b)
}Result:a   map[brand:Ford model:Mustang year:1964]
b   map[Bergen:2 Oslo:1 Stavanger:4 Trondheim:3]

也可以用make()函数创建map

package main
import ("fmt")func main() {var a = make(map[string]string) // The map is empty nowa["brand"] = "Ford"a["model"] = "Mustang"a["year"] = "1964"// a is no longer emptyb := make(map[string]int)b["Oslo"] = 1b["Bergen"] = 2b["Trondheim"] = 3b["Stavanger"] = 4fmt.Printf("a\t%v\n", a)fmt.Printf("b\t%v\n", b)
}

想写一个空map,就是得用make()函数。
其他的var 或者:=会导致运行错误。

package main
import ("fmt")func main() {var a = make(map[string]string)var b map[string]string fmt.Println(a == nil)fmt.Println(b == nil)
}Result:false
true

map可以用什么类型的数据做键呢?

Booleans
Numbers
Strings
Arrays
Pointers
Structs Interfaces (as long as the dynamic type supports equality)

获取map元素:

map_name[key]

更新、添加map元素:
和创建是一样的。

删除map元素:

delete(map_name, key)

查找特定元素:

package main
import ("fmt")func main() {var a = map[string]string{"brand": "Ford", "model": "Mustang", "year": "1964", "day":""}val1, ok1 := a["brand"] // Checking for existing key and its valueval2, ok2 := a["color"] // Checking for non-existing key and its valueval3, ok3 := a["day"]   // Checking for existing key and its value_, ok4 := a["model"]    // Only checking for existing key and not its valuefmt.Println(val1, ok1)fmt.Println(val2, ok2)fmt.Println(val3, ok3)fmt.Println(ok4)
}
Result:Ford true false true 
true 

maps are references(类似于return by references)
如果两个map都是同一个哈希表,那么修改一个,另一个也会变。

迭代输出maps元素:
range来迭代输出,但是是无序的。因为maos本身是无序的数据结构。

package main
import ("fmt")func main() {a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}for k, v := range a {fmt.Printf("%v : %v, ", k, v)}
}Result:
two : 2, three : 3, four : 4, one : 1, 

如果想要有序,也可以的,使用如下的方式:

package main
import ("fmt")func main() {a := map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}var b []string             // defining the orderb = append(b, "one", "two", "three", "four")for k, v := range a {        // loop with no orderfmt.Printf("%v : %v, ", k, v)}fmt.Println()for _, element := range b {  // loop with the defined orderfmt.Printf("%v : %v, ", element, a[element])}
}Result:
two : 2, three : 3, four : 4, one : 1, 
one : 1, two : 2, three : 3, four : 4, 

make

make()函数可以创建、初始化slices,
maps、channels。

var intSlice = make([]int, 10)        // when length and capacity is same
var strSlice = make([]string, 10, 20) // when length and capacity is different
var employee = make(map[string]int)employee["Mark"] = 10employee["Sandy"] = 20

make()函数创建channels:

channels是goroutines相互通信的中间件。
goroutines可以并发,相互之间要通信,共享资源。

package main
import "fmt"func main() {// create channel of integer typenumber := make(chan int)// access type and value of channelfmt.Printf("Channel Type: %T\n", number)fmt.Printf("Channel Value: %v", number)}Output
Channel Type: chan int
Channel Value: 0xc00007a060

structs

用户自定义类型,就是类似C++的struct
go语言没有继承,没有super

在这里插入图片描述上图是structs使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GH】【EXCEL】P4: Chart

文章目录 data and chartdonut chart (radial chart)Radial Chart bar chartBar Chart line chartLine Chart Scatter ChartScatter Chart Surface ChartSurface Chart Chart DecoratorsChart Decorators Chart GraphicsChart Graphics data and chart donut chart (radial cha…

C语言04--数组超详解

1.基本概念 逻辑&#xff1a;一次性定义多个相同类型的变量&#xff0c;并存储到一片连续的内存中语法&#xff1a; 数据类型 数组名字 [ 数据的量 ] ; 示例&#xff1a; int a[5]; int Num ; 语法释义&#xff1a; a 是数组名&#xff0c;即这片连续内存的名称[5] …

一文入门:使用 Python的requests 库

简介 requests 是 Python 中一个简单易用的 HTTP 库&#xff0c;用于发送各种 HTTP 请求。它建立在 Python 标准库 urllib 之上&#xff0c;提供了更人性化的接口。 安装 requests 库 在开始之前&#xff0c;确保你已经安装了 requests 库。如果还没有安装&#xff0c;可以通…

基于WEB的旅游推荐系统设计与实现

TOC springboot280基于WEB的旅游推荐系统设计与实现 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔…

(七)Flink Watermark

Flink 的 Watermark 是用来标识数据流中的一个时间点。Watermark 的设计是为了解决乱序数据处理的问题,尤其是涉及到多个分区的 Kafka 消费者时。在 Watermark 的作用下,即使某些数据出现了延迟到达的情况,也不会导致整个处理流程的中断。此外,Watermark 还能防止过期的数据…

五、2 移位操作符赋值操作符

1、移位操作符 2、赋值操作符 “ ”赋值&#xff0c;“ ”判断是否相等 1&#xff09;连续赋值 2&#xff09;复合赋值符

驾驭时间之舟:SQL中时序数据处理的深度探索

标题&#xff1a;驾驭时间之舟&#xff1a;SQL中时序数据处理的深度探索 在数据的长河中&#xff0c;时间序列数据以其独特的流动性和连续性&#xff0c;记录着世界的每一次脉动。SQL作为数据查询的通用语言&#xff0c;在处理时序数据时&#xff0c;也展现出了其独特的魅力和…

VS Code开发C#(.NET)之快速入门

本篇快速介绍在VS Code中开发C#的完整说明和示例&#xff1a; 环境准备 安装VS Code&#xff1a; 前往Visual Studio Code官网 下载并安装VS Code。 安装.NET SDK&#xff1a; C#是基于.NET框架的&#xff0c;因此需要安装 .NET SDK。 前往 .NET官网 下载并安装适用于操…

每天一个数据分析题(四百九十一)- 主成分分析与因子分析

因子载荷矩阵是主成分载荷矩阵&#xff08;&#xff09;的结果 A. 最小方差斜交旋转 B. 最大方差斜交旋转 C. 最小方差正交旋转 D. 最大方差正交旋转 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖…

成为Python砖家(4): 装饰器的简单理解

第一次理解 Python 中的装饰器&#xff08;decorator&#xff09;&#xff0c;是Python中一个非常强大的工具&#xff0c;它是一个返回函数的函数。 上面这个定义很简洁&#xff0c;但是没说清楚。 第二次理解 装饰器&#xff0c;是一个接收函数 func、返回封装后的函数 wr…

编译器揭秘

从上世纪50年代开始&#xff0c;编程语言五花八门&#xff0c;编译器和解释器层出不穷。此处只列出常见编程语言的编译器和解释器信息&#xff0c;不常见的编程语言有单独文章介绍。 C/C cc 此处代表Unix C编译器&#xff0c;其他平台可能借用cc软链接到真正的C编译器。MSVC 微…

【生日视频制作】路虎劳斯莱斯中控改名字AE模板修改文字软件生成器教程特效素材【AE模板】

路虎劳斯莱斯中控改名字生日视频制作教程AE模板改文字软件特效 怎么如何做的【生日视频制作】路虎劳斯莱斯中控改名字AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频

Element-UI Table实现列表筛选数据及列表嵌套选择框

VUE 框架在 Element UI 的基础上&#xff0c;Table 组件中实现了列表数据的修改功能&#xff0c;支持单选和多选功能&#xff0c;并且列表具备筛选功能。样式如图所示。 功能介绍 点击table列名实现筛选查询功能相关性判断点击列表中的正方形实现选择框功能&#xff0c;同时修…

Qt5 编译 Qt creator 源码中的 designer 模块

文章目录 下载 Qt Creator 源码 下载 Qt Creator 源码 Github: https://github.com/qt/qttools 笔记打算用 Qt 5.12.12 来编译 qt creator-designer 所以笔者下载的是 tag - 5.12.12 &#xff0c;解压后如下&#xff0c;先删除多余的文件&#xff0c;后续还要删除更多文件方便…

Rivian暂停亚马逊送货车生产,特斯拉Roadster再引关注

Rivian遭遇供应链挑战&#xff0c;暂停亚马逊送货车生产 电动汽车制造商Rivian近期宣布&#xff0c;由于零部件短缺&#xff0c;已暂停为零售巨头亚马逊生产商业送货车。这一决定标志着Rivian在应对供应链挑战方面遭遇了最新挫折。作为Rivian的最大投资者&#xff0c;亚马逊持有…

anaconda学习笔记:复制anaconda的base环境

在anaconda的图形界面中&#xff0c;新建环境&#xff0c;可以看到&#xff0c;默认的包只有几个&#xff08;这里是10个&#xff09;&#xff0c;像常用的numpy、pandas等等都没有&#xff0c;在使用过程中还需要再次安装。 而base环境有几百个&#xff08;325个&#xff09;这…

【Java 数据结构】PriorityQueue介绍

优先级队列 回顾二叉树堆堆是什么堆的实现初始化堆的创建向下调整建堆复杂度插入向上调整建堆复杂度删除 PriorityQueue类介绍PriorityQueue是什么PriorityQueue使用构造方法常用方法 PriorityQueue源码介绍Top-K问题 回顾二叉树 上一次我们简单的了解了二叉树这个数据结构, 但…

【Linux】软硬链接

1 .硬链接 我们知道&#xff0c;真正找到磁盘上文件的并不是文件名&#xff0c;而是inode。 其实在linux中可以让多个文件名对应于同一个inode。 我们可以通过以下命令创建一个文件的硬连接。 ln path(文件的相对/绝对路径) newname&#xff08;新文件名字&#xff09; 通过…

三个AI智能体开源项目:MetaGPT/AutoGPT/DB-GPT

三个AI智能体开源项目&#xff1a;MetaGPT/AutoGPT/DB-GPT (qq.com) MetaGPT以其元学习的能力&#xff0c;展现出自我优化的独特魅力&#xff1b;AutoGPT则以其自动化的特性&#xff0c;为编程领域带来了革命性的变革&#xff1b;而DB-GPT则在数据库管理领域&#xff0c;以其深…

requests快速入门

1 安装requests库 如果你还没有安装requests库&#xff0c;可以通过pip安装&#xff1a; pip install requests 2 GET请求 GET请求通常用于从服务器请求数据。使用requests.get()函数可以发送GET请求。 2.1 基本使用 import requests url https://api.example.com/da…