Go语言基础知识学习(一)

Go基本数据类型

在这里插入图片描述

bool

bool型值可以为true或者false,例子:

var b bool = true

数值型

类型表示范围
int8有符号8位整型-128 ~ 127
int16有符号16位整型-32768 ~ 32767
int32有符号32位整型-2147783648 ~ 2147483647
int64有符号64位整型···
uint8无符号8位整型0 ~ 255
uint16无符号16位整型0 ~ 65535
uint32无符号32位整型0 ~ 4294967295
uint64无符号64位整型···

浮点型

类型表示
float3232位浮点数
float6464位浮点数

其他

类型表示
byteuint8
runeint32

数据类型的转换

简单的转换操作

package mainimport ("fmt""strconv"
)// 类型转换
func main() {var a int8 = 12var b = uint8(a)var f float32 = 3.14var c = int32(f)fmt.Println(b, c)var f64 = float64(a)fmt.Println(f64)type IT int //类型要求很严格var d IT = 13fmt.Println(d)//字符串转数字var istr = "12a"//字符串转数字的方法,返回转换的值和errormint, err := strconv.Atoi(istr)if err != nil {fmt.Println("convert error!")} else {fmt.Println(mint)}var myi = 32//数字转字符串mstr := strconv.Itoa(myi)fmt.Println(mstr)//字符串转为float32, 转换为boolfl, err2 := strconv.ParseFloat("3.1415926", 64)if err2 != nil {return}fmt.Println(fl)//字符串转为整数parseInt, err3 := strconv.ParseInt("-42", 10, 64)if err3 != nil {return}fmt.Println(parseInt)//字符串转为boolparseBool, parseBoolErr := strconv.ParseBool("true")if parseBoolErr != nil {return}fmt.Println(parseBool)//基本类型转为字符串boolStr := strconv.FormatBool(true)fmt.Println(boolStr)//float转为字符串floatStr := strconv.FormatFloat(3.1415926, 'f', -1, 64)fmt.Println(floatStr)fmt.Println(strconv.FormatInt(42, 16))
}

运算符和表达式

package mainimport "fmt"func main() {// 运算符 + - * / % ++ --var a, b = 1, 2fmt.Println(a + b) //3var astr, bstr = "hello", "zed"fmt.Println(astr + bstr) //hellozed//取余fmt.Println(3 % 2) //1a++fmt.Println(a) //2//逻辑运算符var abool, bbool = true, falsefmt.Println(abool && bbool) //falsefmt.Println(abool || bbool) //truefmt.Println(!abool)         //false//位运算符var A = 60var B = 13fmt.Println(A & B) // 12
}

字符串

格式化输出

package mainimport ("fmt""strconv""strings"
)func main() {//转义符courseName := "go\"体系课\""fmt.Println(courseName)//格式化输出username := "bobby"out := "hello" + username //简单组装输出fmt.Println(out)age := 18address := "北京"fmt.Println("用户名: " + username + "," + "年龄: " + strconv.Itoa(age) + ",地址: " + address)fmt.Printf("用户名: %s, 年龄: %d, 地址: %s", username, age, address) //非常常用,性能不好userMsg := fmt.Sprintf("用户名: %s, 年龄: %d, 地址: %s", username, age, address)fmt.Println(userMsg)//通过string的builder进行字符串拼接,高性能var builder strings.Builderbuilder.WriteString("用户名: ")builder.WriteString(username)builder.WriteString(", 年龄: ")builder.WriteString(strconv.Itoa(age))builder.WriteString(", 地址: ")builder.WriteString(address)re := builder.String()fmt.Println(re)
}

字符串的比较

package mainimport "fmt"func main() {//字符串的比较a := "hello"b := "hello"fmt.Println(a == b) // true//字符串的大小比较c := "bello"fmt.Println(a > c) //true,比较asic码的大小
}

字符串的操作方法

package mainimport ("fmt""strings"
)func main() {//字符串的比较a := "hello"b := "hello"fmt.Println(a == b) // true//字符串的大小比较c := "bello"fmt.Println(a > c) //true,比较asic码的大小//是否包含某字符串name := "goland-工程师"isContains := strings.Contains(name, "goland")fmt.Println(isContains)//查询字串出现的次数fmt.Println(strings.Count(name, "o")) //1//分割字符串fmt.Println(strings.Split(name, "-")) //[goland 工程师]//字符串是否包含前缀 是否包含后缀fmt.Println(strings.HasPrefix(name, "g")) //truefmt.Println(strings.HasSuffix(name, "g")) //false//查询字串出现的位置fmt.Println(strings.Index(name, "师")) //14 字节出现的位置//字串替换fmt.Println(strings.Replace(name, "goland", "java", 1))//大小写转换fmt.Println(strings.ToLower(name))fmt.Println(strings.ToUpper(name)) // GOLAND//去掉特殊字符串fmt.Println(strings.Trim("hello go   ", " ")) // hello go, 去掉的是左右的所有被指定的字符串}

条件判断与for循环

条件判断

package mainimport "fmt"/* if bool表达式 {逻辑
}
*/func main() {//条件判断age := 22country := "中国"if age < 18 && country == "中国" {fmt.Println("未成年人")} else if age == 18 {fmt.Println("刚好是成年人")} else {fmt.Println("成年人")}}

for循环

package mainimport "fmt"func main() {/*for循环for init; condition; post {逻辑}*/for i := 0; i < 3; i++ {fmt.Println(i)}//打印九九乘法表for i := 1; i <= 9; i++ {for j := 1; j <= i; j++ {fmt.Printf("%d * %d = %d ", i, j, i*j)}fmt.Println()}//for range,主要是对字符串、数组、切片、map、channel的遍历/**for index, value := range 遍历的数据 {}1. 如果遍历的是字符串的话,key为字符串的索引,value字符串对应的缩影的字符的值的拷贝,如果不鞋key,返回的是索引2. 数组: key为数组的索引,value为索引对应的值的拷贝3. 切片: key为切片的索引,value为索引对应的值的拷贝4. map: key为map的key, value为key对应的值的拷贝5. channel:  无key,    value为channel接收的数据*/name := "hello, go"for index, value := range name {//fmt.Println(index, value)fmt.Printf("%d %c\r\n", index, value)}//不想打印index,可以使用匿名变量fmt.Println("----------------------------")for _, value := range name {fmt.Printf("%c\r\n", value)}fmt.Println("----------------------------")for index := range name {fmt.Printf("%c\r\n", name[index])}
}

goto

package mainimport "fmt"/*
*
goto语句可以让我的代码跳到指定的代码块中运行
很少用
*/
func main() {for i := 0; i < 5; i++ {for j := 0; j < 4; j++ {if j == 2 {goto over}fmt.Println(i, j)}}over:fmt.Println("over")}

switch

package mainimport "fmt"func main() {/*switch val {case val1:...case val2:...default:...}*///中文的星期几,输出对应的英文day := "周五"switch day {case "周一":fmt.Println("Mongday")case "周五":fmt.Println("Friday")case "周三":fmt.Println("Wednesday")default:fmt.Println("Saturday")}score := 95switch {case score < 60:fmt.Println("E")case score >= 60 && score < 70:fmt.Println("D")case score >= 70 && score < 80:fmt.Println("C")case score >= 80 && score < 90:fmt.Println("b")case score >= 90 && score <= 100:fmt.Println("A")}switch score {case 60, 70, 80:fmt.Println("牛")default:fmt.Println("牛牛")}
}

Go语言的容器

数组、切片(slice)、map、list

Go–数组

package mainimport "fmt"func main() {/*go语言提供了哪些集合类型的数据结构1、数组2、切片(slice)3、map4、list*/// 数组 定义: var name [count]intvar courses1 [3]string //courses1类型: 只有三个元素的数组类型var courses2 [4]string //courses2类型: 只有四个元素的数组类型fmt.Printf("%T\r\n", courses1)fmt.Printf("%T\r\n", courses2)courses1[0] = "go"courses1[1] = "grpc"courses1[2] = "gin"fmt.Println(courses1)//对数组进行遍历,indexfor _, value := range courses1 {fmt.Println(value)}
}

Go–Slice切片

package mainimport "fmt"func main() {//go折中var courses []stringfmt.Printf("%T\r\n", courses)courses = append(courses, "Java", "Python", "Golang")fmt.Println(courses)//访问切片的元素 访问一个,根据下标访问 or 访问多个fmt.Println(courses[2])//访问多个coursesSlice := []string{"Java", "Go", "mysql", "Kafka", "Redis", "ElasticSearch"}/*courseSlice[start:end] 左闭右开区间,1、如果只有start,没有end,表示从start开始到结尾的所有数据2、如果没有start,只有end,表示从0到end之间的所有的数据3、没有start没有end就是复制了一份*/fmt.Println(coursesSlice[1:3])fmt.Println(coursesSlice[0:])fmt.Println(coursesSlice[:3])fmt.Println(coursesSlice[:])//切片数据的添加coursesSlice2 := []string{"go", "grpc"}//若想合并两个切片的数据coursesSlice3 := []string{"python", "kafka"}for _, val := range coursesSlice3 {coursesSlice2 = append(coursesSlice2, val)}coursesSlice2 = append(coursesSlice2, coursesSlice3...)coursesSlice2 = append(coursesSlice2, "gin", "mysql", "es")fmt.Println(coursesSlice2)//如何删除slice中的元素,利用append函数重新生成slicecoursesSlice4 := []string{"go", "Java", "Python", "MySQL"}newSlice := append(coursesSlice4[:2], coursesSlice4[3:]...)fmt.Println(newSlice)//复制slicecoursesSlice4Copy := coursesSlice4coursesSlice4Copy2 := coursesSlice4[:]fmt.Println(coursesSlice4Copy)fmt.Println(coursesSlice4Copy2)var newCoursesSliceCopy = make([]string, len(coursesSlice4))copy(newCoursesSliceCopy, coursesSlice4)fmt.Println(newCoursesSliceCopy)fmt.Println("--------直接赋值和使用copy函数的区别--------")coursesSlice4[0] = "golang"fmt.Println(coursesSlice4Copy[0])fmt.Println(newCoursesSliceCopy[0])
}

切片在函数参数传递时是值传递还是引用传递

package mainimport ("fmt""strconv"
)func printSlice(data []string) {data[0] = "java"for i := 0; i < 10; i++ {data = append(data, strconv.Itoa(i))}
}func main() {/*go的slice在函数参数传递的时候是值传递还是引用传递?答案是值传递,但是效果呈现的是引用的效果(不完全是)这个代码呈现的结果是,如果是对当前slice进行值的修改,发现改成功了,但是想加数据却加不了,现象是改数据看起来是引用传递了,加数据反而是值传递的效果*/courses := []string{"go", "grpc", "gin"}printSlice(courses)fmt.Println(courses)
}

Go容器–map

package mainimport "fmt"func main() {/*map是一个key(索引)和value(值)的无序集合查询方便O(1)*/var coursesMap = map[string]string{"go":   "golang工程师","grpc": "grpc入门","gin":  "gin深入理解",}fmt.Println(coursesMap["grpc"])//放值coursesMap["mysql"] = "mysql原理"//var nullMap map[string]string //nil, map类型如果想设置值,必须要初始化//nullMap["mysql"] = "mysql原理"//fmt.Println(nullMap)//fmt.Println(coursesMap)var nullMap2 = map[string]string{}nullMap2["mysql"] = "mysql原理"fmt.Println(nullMap2)//使用make函数初始化,make是内置函数,主要用于初始化slice map channelvar nullMap3 = make(map[string]string, 3)nullMap3["mysql"] = "mysql原理"fmt.Println(nullMap3)/*map必须初始化采用使用, 初始化的方法1. map[string]string{}2. make(map[string]string, 3 )3. 但是slice可以不初始化*/var slirceTest []stringif slirceTest == nil {fmt.Println("slirceTest is nil")}slirceTest = append(slirceTest, "a")/**map的两种赋值方法:1. 初始化的赋值:var coursesMap = map[string]string{"go":   "golang工程师","grpc": "grpc入门","gin":  "gin深入理解",}2. 直接手动赋值:coursesMap["mysql"] = "mysql原理"*///遍历mapfmt.Println("-------------map的遍历---------------")for key, value := range coursesMap {fmt.Println(key, value)}fmt.Println("-------------map的遍历,只打印key---------------")for key := range coursesMap {fmt.Println(key, coursesMap[key])}//map是无序的,并且不保证每次打印是相同的数据fmt.Println("-------------map寻找key不存在的数据---------------")d := coursesMap["java"]fmt.Println(d)if _, ok := coursesMap["java"]; !ok {fmt.Println("not in")} else {fmt.Println("in")}//删除一个元素delete(coursesMap, "grpc")fmt.Println(coursesMap)delete(coursesMap, "rpc") //删除不存在的元素也不会报错//重要提示, map不是线程安全的
}

Go容器 – list(链表)

package mainimport ("container/list""fmt"
)func main() {var mylist = list.List{}mylist.PushBack("go")mylist.PushBack("grpc")mylist.PushBack("gin")fmt.Println(mylist)//遍历打印值,从头遍历for i := mylist.Front(); i != nil; i = i.Next() {fmt.Println(i.Value)}fmt.Println("----------反向遍历----------")//反向遍历for i := mylist.Back(); i != nil; i = i.Prev() {fmt.Println(i.Value)}fmt.Println("----------初始化list的方法----------")newList := list.New()newList.PushFront("mysql")for i := newList.Front(); i != nil; i = i.Next() {fmt.Println(i.Value)}//插入指定元素之前或者之后fmt.Println("----------插入指定元素之前或者之后----------")i := newList.Front()for ; i != nil; i = i.Next() {if i.Value.(string) == "mysql" {break}}newList.InsertBefore("oracle", i)for i := newList.Front(); i != nil; i = i.Next() {fmt.Println(i.Value)}//list删除fmt.Println("----------newList删除----------")newList.Remove(i)for i := newList.Front(); i != nil; i = i.Next() {fmt.Println(i.Value)}
}

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

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

相关文章

优思学院|如何建立公司运营指标体系?如何推行六西格玛改进运营指标?

关键绩效指标 (KPI) 是测量您团队或组织朝重要商业目标进展表现如何的量化指标&#xff0c;组织会在多个层面使用 KPI&#xff0c;这视乎您想要追踪何指标而定&#xff0c;您可以设定全组织的、特定团队的、或甚至是个人 KPI。 良好的KPI能让公司管理者掌握组织的营运是否进度…

使用React 18、Echarts和MUI实现温度计

关键词 React 18 Echarts和MUI 前言 在本文中&#xff0c;我们将结合使用React 18、Echarts和MUI&#xff08;Material-UI&#xff09;库&#xff0c;展示如何实现一个交互性的温度计。我们将使用Echarts绘制温度计的外观&#xff0c;并使用MUI创建一个漂亮的用户界面。 本文…

点评项目——分布式锁

2023.12.10 集群模式下的并发安全问题及解决 随着现在分布式系统越来越普及&#xff0c;一个应用往往会部署在多台机器上&#xff08;多节点&#xff09;&#xff0c;通过加锁可以解决在单机情况下的一人一单安全问题&#xff0c;但是在集群模式下就不行了。见下图&#xff1a…

在 Android WebView 中实现和 JavaScript 的互操作

前言 在 APP 中内嵌一个 H5 来实现特定的业务功能已经是非常成熟且常用的方案了。 虽然 H5 已经能够实现大多数的需求&#xff0c;但是对于某些需求还是得依靠原生代码来实现然后与 JavaScript 进行交互&#xff0c;例如我目前所负责的项目就是一个 “智能硬件” 设备&#x…

【PyTorch】卷积神经网络

文章目录 1. 理论介绍1.1. 从全连接层到卷积层1.1.1. 背景1.1.2. 从全连接层推导出卷积层 1.2. 卷积层1.2.1. 图像卷积1.2.2. 填充和步幅1.2.3. 多通道 1.3. 池化层&#xff08;又称汇聚层&#xff09;1.3.1. 背景1.3.2. 池化运算1.3.3. 填充和步幅1.3.4. 多通道 1.4. 卷积神经…

实现React18加TS,解决通用后台管理系统,实战方案落地有效实践经验

随着前端技术的不断发展和更新&#xff0c;使用React 18结合TypeScript&#xff08;TS&#xff09;来构建通用后台管理系统已成为一种常见的选择。本文将介绍如何在项目中应用React 18和TS&#xff0c;并分享一些实战方案的有效实践经验。 一、搭建React 18 TS项目 首先&…

12.2每日一题(1无穷型幂指函数:二倍角公式+三部曲+等价无穷小代换(只有整体的因子不为0才能先算出来))

注意&#xff1a;求极限不能想先算哪里就先算哪里&#xff0c;只有整体的因子不为0才能先算出来&#xff0c;部分不为0不可以先算

外贸老业务也棘手的一个问题

这几天有2个老业务都被一个类同的问题缠住了。 客户定购了三台车&#xff0c;由于是非常规要求所以我建议收取全款或者最少收50%的定金。但是业务员为了当月业绩或者为了拿到就收了客户20% 或者30% &#xff0c;定金收到了&#xff0c;我也不好再逼着业务员去加收定金。 订单就…

记录 | ubuntu上安装fzf

在 ubuntu 上采用命令行安装 fzf 的方式行不通 指的是采用下面的方式行不通&#xff1a; sudo apt install fzf # 行不通 sudo snap install fzf --classic # 行不通正确的安装方式是&#xff1a; ● 到 fzf 的 git 仓库&#xff1a;https://github.com/junegunn/fzf/re…

计算机毕业设计 基于SpringBoot的电动车租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

场景示例:有赞商城 × 微盛企微管家,助力零售企业,实现私域运营自动化

1 场景描述 在零售行业内&#xff0c;线上渠道已经是零售行业的主要销售渠道&#xff0c;大多数零售企业都会将产品上架到有赞商城&#xff0c;并使用微盛企微管家系统进行客户管理和服务&#xff0c;希望能对客户画像进行精细化管理&#xff0c;以提升销售和服务效率。 然而&a…

2023年最新prometheus + grafana搭建和使用+gmail邮箱告警配置

一、安装prometheus 1.1 安装 prometheus官网下载地址 sudo -i mkdir -p /opt/prometheus #移动解压后的文件名到/opt/,并改名prometheus mv prometheus-2.45 /opt/prometheus/ #创建一个专门的prometheus用户&#xff1a; -M 不创建家目录&#xff0c; -s 不让登录 useradd…

女士内衣市场分析:预计2028年将达到643.08亿美元

内衣 (英文名:Underwear)&#xff0c;是指贴身穿的衣物。内衣有保暖及污秽的危害作用&#xff0c;有时会被视为性征。女士内衣行业生产的主要原料是各类织布或无纺布&#xff0c;成分有海绵、边、定型纱、骨胶、肩带等&#xff0c;布面料在内衣企业的生产成本中所占比重较大。女…

Python基础(四、探索迷宫游戏)

Python基础&#xff08;四、探索迷宫游戏&#xff09; 游戏介绍游戏说明 游戏介绍 在这个游戏中&#xff0c;你将扮演一个勇敢的冒险者&#xff0c;进入了一个神秘的迷宫。你的任务是探索迷宫的每个房间&#xff0c;并最终找到隐藏在其中的宝藏。 游戏通过命令行界面进行交互…

web 前端之标签练习+知识点

目录 实现过程&#xff1a; 结果显示 1、HTML语法 2、注释标签 3、常用标签 4、新标签 5、特殊标签 6、在网页中使用视频和音频、图片 7、表格标签 8、超链接标签 使用HTML语言来实现该页面 实现过程&#xff1a; <!DOCTYPE html> <html><head>…

泡沫包装市场分析:预计2029年将达到659亿元

泡沫包装&#xff0c;简单地讲&#xff0c;就是用数学方法对无线电测量或光学测量所获得的弹道数据进行检验、整理、校正、计算&#xff0c;减小或消除数据的误差&#xff0c;得出反映运载火箭运动轨迹的精确弹道参数。通常所说的泡沫包装&#xff0c;主要是指由可发性聚苯乙烯…

超静音的两相步进电机驱动芯片GC6609,GC6610的性能分析

两相步进电机驱动芯片GC6609&#xff0c;GC6610它们是一款超静音的两相步进电机驱动芯片&#xff0c;内置最大 256 细分的步进驱动模式&#xff0c; 超静音&#xff0c;低振动。芯片可以工作在 4~36V 的宽工作电压范围内&#xff0c;平均工作电流可以达到 2A和2.5A &#xff0c…

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈&#xff1a;大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据…

STM32-01-认识单片机

文章目录 一、单片机简介二、Cortex-M系列介绍三、初识STM32四、STM32原理图设计五、搭建开发环境六、STM32初体验七、MDK5使用技巧 一、单片机简介 单片机是什么&#xff1f; 单片机&#xff1a;Single-Chip Microcomputer&#xff0c;单片微型计算机&#xff0c;是一种集成电…

Golang channle(管道)基本介绍、快速入门

channel(管道)-基本介绍 为什么需要channel&#xff1f;前面使用全局变量加锁同步来解决goroutine的通讯&#xff0c;但不完美 1)主线程在等待所有goroutine全部完成的时间很难确定&#xff0c;我们这里设置10秒&#xff0c;仅仅是估算。 2)如果主线程休眠时间长了&#xff0c…