Go Roadmap-Basics中文笔记

news2024/11/17 1:36:59

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     // Boolean
  var b int = 5         // Integer
  var c float32 = 3.14  // Floating point number
  var d string = "Hi!"  // String

  fmt.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 := true
	if 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 := 0
	total = x + y
	fmt.Println(total)
}

func main() {
	// Passing arguments
	add(20, 30)
}

带返回值函数:

package main
import "fmt"

func add(x int, y int) int {
	total := 0
	total = x + y
	return total
}

func main() {
	// Accepting return value in varaible
	sum := 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 address
	return
}

func main() {
	var age = 20
	var 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 root
  fmt.Println(math.Sqrt(25))    // 5
  // find the cube root
  fmt.Println(math.Cbrt(27))    // 3
  // find the maximum number
  fmt.Println(math.Max(21, 18))    // 21
  // find the minimum number
  fmt.Println(math.Min(21, 18))    // 18
  // find the remainder
  fmt.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)

}
Output

golang 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 int
    fmt.Println(v)    // 42
     
    var i int = 42
    str := strconv.Itoa(i)        // convert int to string
    fmt.Println(str) // 42
}

Type Inference

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

package main
import "fmt"
func main() {
	// Multiple variable declarations with inferred types
    var firstName, lastName, age, salary = "John", "Maxwell", 28, 50000.0

    fmt.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, true
	fmt.Println(name, age, salary, isProgrammer)
}

# Output
Rajeev Singh 35 50000 true

Arrays

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

package main
import "fmt"

func main() {
	var a [2]string
	a[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 now
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"
                                 // a is no longer empty
  b := make(map[string]int)
  b["Oslo"] = 1
  b["Bergen"] = 2
  b["Trondheim"] = 3
  b["Stavanger"] = 4

  fmt.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 value
  val2, ok2 := a["color"] // Checking for non-existing key and its value
  val3, ok3 := a["day"]   // Checking for existing key and its value
  _, ok4 := a["model"]    // Only checking for existing key and not its value

  fmt.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 order
  b = append(b, "one", "two", "three", "four")

  for k, v := range a {        // loop with no order
    fmt.Printf("%v : %v, ", k, v)
  }

  fmt.Println()

  for _, element := range b {  // loop with the defined order
    fmt.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"] = 10
    employee["Sandy"] = 20

make()函数创建channels:

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

package main
import "fmt"

func main() {
  
  // create channel of integer type
   number := make(chan int)
 
  // access type and value of channel
  fmt.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.coloradmin.cn/o/2049646.html

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

相关文章

【2】初识JVM

目录 一.什么是JVM 二.JVM的功能 2.1即时编译 三.常见的JVM​编辑 ​编辑 总结​编辑 一.什么是JVM 二.JVM的功能 2.1即时编译 三.常见的JVM 总结

Spring MVC Controller返回json日期格式配置失效的解决办法

如题&#xff0c;Spring MVC 4.3.0版本&#xff0c;配置jackson读写json。Controller层方法返回值对象包含java.util.Date类型的属性&#xff0c;并且在applicationContext.xml中配置了jackson的日期格式&#xff1a; <mvc:annotation-driven><mvc:message-converters…

【ARM+Codesys 客户案例 】RK3568/A40i/STM32+CODESYS在工厂自动化中的应用:PCB板焊接机

现代化生产中&#xff0c;电子元件通常会使用自动化设备来进行生产&#xff0c;例如像PCB&#xff08;印刷电路板&#xff09;的组装。但是生产过程中也会面临一些问题&#xff0c;类似于如何解决在PCB板上牢固、精准地安装各种组件呢&#xff1f;IBL Lttechnik GmbH公司的CM80…

什么是OpenTiny?

OpenTiny 是一套企业级的 Web 前端开发解决方案&#xff0c;提供跨端、跨框架的 UI 组件库和低代码引擎&#xff0c;帮助开发者高效构建 Web 应用 。企业运用开发中&#xff0c;可以利用 OpenTiny 的以下核心组件和优势&#xff1a; TinyVue 组件库&#xff1a;一个丰富的组件库…

AWS boto3 脚本访问 AWS 资源

AWS boto3 脚本访问 AWS 资源 引言boto3主要功能常见用例安装和基本使用 boto3.Client() 低级客户端基本用法关键参数 boto3.resource() 高级客户端常见参数用法 boto3.resource VS boto3.client相似点不同点总结 关于身份验证凭证隐式身份凭证显式身份验证凭证assuem role如何…

对比各类 AWS MySQL 升级方案及原理

搞了好几个月的MySQL升级终于接近尾声&#xff0c;进入总结梳理阶段~ 本文主要对比升级期间用到的三种方案&#xff1a; 本地升级蓝绿升级API同步升级 对比项 \ 升级方式本地升级蓝绿升级API同步升级停机时间长&#xff0c;3-5分钟不可读写较短&#xff0c;约15秒实例变为只…

Delphi 实现JSON序列化和反序列化的功能以及源码探究

目录 一、JSON序列化和反序列化简介 二、Delphi序列化的两种方式 1、TJson的使用 2、TJsonSerializer的使用 3、使用注意事项 三、Delphi与GO序列化效率对比 1、GO语言JSON序列化方法 2、Delphi 与 GO 序列化效率对比 四、Delphi序列化源码初探 五、Delphi 序列化的优…

NGINX 之 location 匹配优先级

章节 1 NGINX 的源码安装 2 NGINX 核心配置详解 3 NGINX 之 location 匹配优先级 4 NGINX 基础参数与功能 目录 1 location 基础语法 1.1 location 语法说明表 1.2 URI部分简单介绍 2 location 匹配优先级 2.1 URI匹配的规则与顺序 2.2 精确匹配(location /1.txt) 2.3 区…

hutool发邮件功能如何配置SMTP服务器参数?

hutool发邮件的教程指南&#xff1f;hutool发邮件性能优化方法&#xff1f; Hutool作为一个轻量级的Java工具库&#xff0c;其邮件发送功能因其简单易用而受到广泛关注。AokSend将详细介绍如何通过配置SMTP服务器参数来实现Hutool发邮件的功能。 hutool发邮件&#xff1a;优势…

LinuxKernel开发

Linux Kernel简介 0. Linux历史 Linux内核&#xff08;英語&#xff1a;Linux kernel&#xff09;是一种开源的类Unix操作系统宏内核。整个Linux操作系统家族基于该内核部署在传统计算机平台&#xff08;如个人计算机和服务器&#xff0c;以Linux发行版的形式[7]&#xff09;…

【Unity实战】NavMeshAgent实现Strafe固定朝向移动

众所周知&#xff0c;NavMeshAgent一旦设定了destination&#xff0c;它就会直奔目标。但是在一些场景中&#xff0c;比如NPC是个射手&#xff0c;除了瞄准玩家&#xff0c;也需要走位。如果不加以处理&#xff0c;我们恐怕会遇见瞄准IK和朝向…难以言表的表现&#xff0c;直接…

达梦数据库的系统视图v$datafile

达梦数据库的系统视图v$datafile 达梦数据库的V$DATAFILE 是一个重要的系统视图&#xff0c;提供了有关数据库数据文件的信息。 V$DATAFILE 系统视图 V$DATAFILE 视图用于显示数据库中每一个数据文件的详细信息。通过查询这个视图&#xff0c;数据库管理员可以了解数据文件的…

从零搭建xxl-job(六):xxl-job执行器服务端的简单搭建

经过前面的学习&#xff0c;相信大家对XXL-JOB调度中心的核心知识点和定时任务的调度流程已经了如指掌了&#xff0c;接下来&#xff0c;我们的重心就要从调度中心过渡到定时任务程序了&#xff0c;接下来&#xff0c;我会为大家搭建起一个简易的可运行的定时任务的体系&#x…

spring揭秘06-Autowired自动绑定依赖及组件自动扫描

文章目录 【README】【1】基于xml配置文件版本的自动绑定【1.1】基于xml配置文件版本的自动绑定代码示例 【2】基于注解版本的自动绑定【2.1】根据类型匹配的注解版自动绑定Autowired【2.2】根据名称匹配的注解版自动绑定AutowiredQualifier【2.2.1】 示例代码 【2.3】关于Prim…

面向财商人群的AI垂直产品 —— AI股票助手

在数字化转型的大潮中,AI技术正在重塑各行各业,尤其是金融市场。对于那些渴望在瞬息万变的股市中保持敏锐洞察力的金融分析师、投资者及股票爱好者来说,一款强大而智能的工具显得尤为重要。今天,我们将向大家介绍一款专为财商人群打造的AI垂直产品——AI股票助手。 一、产…

mac如何恢复被同名替换掉的文件夹 mac文件被替换如何恢复

Mac系统一直以高性能遥遥领先其他的Windows系统&#xff0c;因此&#xff0c;Mac虽然价格远远高出其他的笔记本电脑&#xff0c;但是还是受到了一众用户的青睐。使用mac时&#xff0c;我们也经常会将一个文件命名为已经有了相同文件的文件名&#xff0c;且保存到同一个目标地址…

吴恩达机器学习-C2W3-多类分类

目标 在本实验中&#xff0c;您将探索一个使用神经网络进行多类分类的示例。 工具 您将使用一些绘图例程。它们存储在这个目录下的lab_utils_multiclass_TF.py中。 import numpy as np import matplotlib.pyplot as plt %matplotlib widget from sklearn.datasets import …

centos7.9最小化安装之后的配置与下载

一. 配置yum源 1.备份系统自带源文件 cd /etc/yum.repos.d/ mkdir bak mv *.repo bak 2. 配置阿里云yum源 若有wget wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo若没有wget&#xff0c;先直接把 http://mirrors.aliyun.com/re…

11.怎么做好一个动态标签页

效果 步骤 1.在Elementui找一个标签页组件 复制粘贴到代码 2.将他写活 将很多页面需要用的方法和变量写入store editableTabsValue: 2,editableTabs: [{title: 首页,name: index,},],addTab(state, tab) {if (state.editableTabs.findIndex(item > item.title tab.titl…

mysql5.7主从同步失败原因总结-windows

1&#xff0c;主库data文件复制到从库&#xff0c;之后主库要同步的实例data一定不要在修改&#xff1b; 1.1&#xff0c;修改之后就要重新覆盖一遍修改过的data 2&#xff0c;如果状态不对&#xff1a;一定要查看日志&#xff1b;比如slave_io_state是空时&#xff0c;需要查…