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] …

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

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

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

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

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官网 下载并安装适用于操…

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

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

【生日视频制作】路虎劳斯莱斯中控改名字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; 通过…

EasyCVR视频汇聚平台构建远程安防监控:5大亮点解析,助力安防无死角

随着科技的飞速发展&#xff0c;远程安防监控系统已经成为现代社会中不可或缺的一部分&#xff0c;无论是在小区、公共场所还是工业领域&#xff0c;安防监控都发挥着至关重要的作用。而EasyCVR作为一款功能强大的视频监控综合管理平台&#xff0c;其在构建远程安防监控系统方面…

电测量数据交换DLMS∕COSEM组件第62部分:COSEM接口类(4)

1.7COSEM服务器模型 COSEM服务器被构建为3层体系结构如图3所示。 图4示例说明如何用COSEM服务器模型构建一台组合式计量设备。 1.8COSEM逻辑设备 1.8.1概述 COSEM逻辑设备包含一组COSEM对象,每个物理设备均应包含一个“Management logical device”。对COSEM逻辑设备…

大模型之战-操作数据表-coze

工作流直接操作数据库啦【何时可以直接访问自己的数据库呢】 1&#xff0c;第一步创建一个bot智能体 1.1&#xff0c;bot中创建数据库表&#xff1a; 1.2&#xff0c;智能体可以通过对话&#xff0c;操作表&#xff1b;【增加&#xff0c;筛选查询等】 1.2.1&#xff0c;增加…

Transformer(课程笔记)

一&#xff1a;Motivation RNN需要顺序的执行&#xff0c;不利于并行计算。 RNN的变体例如GRU、LSTM等需要依靠注意力机制解决信息瓶颈等问题。 抛弃RNN结构&#xff0c;提出了Transformer结构。 Transformer整体架构 二&#xff1a; 输入层&#xff08;BPE&#xff0c;PE&…

第2章-01-网站中的资源介绍

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲。 🎉欢迎 👍点赞✍评论⭐收…

Linux下查看各进程的swap

cat /etc/re*se Red Hat Enterprise Linux Server release 6.8 (Santiago) 简单的可以通过top命令查看 top 后 按 f 进入选择列界面 按 p 就会输出swap信息&#xff08;变为P&#xff09; 回车返回看到SWAP信息了 再按 F 再按p 按swap排序 再回车后就是各进程按swap排序…

linux:进程优先级、环境变量、地址空间

进程优先级 什么叫进程优先级&#xff1f; 进程优先级是指进程获取某些资源的先后顺序 上文中的task_struct&#xff0c;也叫进程控制块&#xff08;PCB&#xff09;&#xff0c;本质上是结构体&#xff0c;我们的优先级就被写在结构体里面&#xff08;内部字段&#xff09;…