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 main

import (
	"fmt"
	"strconv"
)

// 类型转换
func main() {

	var a int8 = 12
	var b = uint8(a)

	var f float32 = 3.14
	var c = int32(f)

	fmt.Println(b, c)

	var f64 = float64(a)
	fmt.Println(f64)

	type IT int //类型要求很严格
	var d IT = 13
	fmt.Println(d)

	//字符串转数字
	var istr = "12a"
	//字符串转数字的方法,返回转换的值和error
	mint, 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, 转换为bool
	fl, 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)

	//字符串转为bool
	parseBool, 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 main

import "fmt"

func main() {
	// 运算符 + - * / % ++ --
	var a, b = 1, 2
	fmt.Println(a + b) //3

	var astr, bstr = "hello", "zed"
	fmt.Println(astr + bstr) //hellozed

	//取余
	fmt.Println(3 % 2) //1
	a++
	fmt.Println(a) //2

	//逻辑运算符
	var abool, bbool = true, false
	fmt.Println(abool && bbool) //false
	fmt.Println(abool || bbool) //true
	fmt.Println(!abool)         //false

	//位运算符
	var A = 60
	var B = 13
	fmt.Println(A & B) // 12
}

字符串

格式化输出

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {

	//转义符
	courseName := "go\"体系课\""
	fmt.Println(courseName)

	//格式化输出
	username := "bobby"
	out := "hello" + username //简单组装输出
	fmt.Println(out)

	age := 18
	address := "北京"
	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.Builder
	builder.WriteString("用户名: ")
	builder.WriteString(username)
	builder.WriteString(", 年龄: ")
	builder.WriteString(strconv.Itoa(age))
	builder.WriteString(", 地址: ")
	builder.WriteString(address)

	re := builder.String()
	fmt.Println(re)
}

字符串的比较

package main

import "fmt"

func main() {

	//字符串的比较
	a := "hello"
	b := "hello"
	fmt.Println(a == b) // true

	//字符串的大小比较
	c := "bello"
	fmt.Println(a > c) //true,比较asic码的大小
}

字符串的操作方法

package main

import (
	"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")) //true
	fmt.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 main

import "fmt"

/* if bool表达式 {
	逻辑
}
*/

func main() {
	//条件判断
	age := 22
	country := "中国"
	if age < 18 && country == "中国" {
		fmt.Println("未成年人")
	} else if age == 18 {
		fmt.Println("刚好是成年人")
	} else {
		fmt.Println("成年人")
	}

}

for循环

package main

import "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 main

import "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 main

import "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 := 95
	switch {
	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 main

import "fmt"

func main() {

	/*
			go语言提供了哪些集合类型的数据结构
		    1、数组
			2、切片(slice)
			3、map
			4、list
	*/

	// 数组 定义: var name [count]int
	var 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)

	//对数组进行遍历,index
	for _, value := range courses1 {
		fmt.Println(value)
	}
}

Go–Slice切片

package main

import "fmt"

func main() {

	//go折中
	var courses []string
	fmt.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函数重新生成slice
	coursesSlice4 := []string{"go", "Java", "Python", "MySQL"}
	newSlice := append(coursesSlice4[:2], coursesSlice4[3:]...)
	fmt.Println(newSlice)

	//复制slice
	coursesSlice4Copy := coursesSlice4
	coursesSlice4Copy2 := 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 main

import (
	"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 main

import "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 channel
	var 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 []string
	if 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原理"
	*/

	//遍历map
	fmt.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 main

import (
	"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.mfbz.cn/a/235885.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用CLion进行cuda编程,并使用cuda-gdb对核函数进行debug,这可能是全网你能够找到的最详细的CLion和cuda编程环境配置教程了

文章目录 前言一、环境准备二、相关学习资料三、环境配置1.新建Clion C Executable项目2.在Clion中的ToolChains中配置cuda-gdb3.配置CMake options4.配置CMakeLists.txt(1) Failed to compute shorthash for libnvrtc.so(2) c: error: unrecognized command-line option -G(3)…

【华为数据之道学习笔记】3-2 基础数据治理

基础数据用于对其他数据进行分类&#xff0c;在业界也称作参考数据。基础数据通常是静态的&#xff08;如国家、币种&#xff09;&#xff0c;一般在业务事件发生之前就已经预先定义。它的可选值数量有限&#xff0c;可以用作业务或IT的开关和判断条件。当基础数据的取值发生变…

AI PC行业深度研究报告:AI PC革新端侧AI交互体验

今天分享的人工智能系列深度研究报告&#xff1a;《AI PC行业深度研究报告&#xff1a;AI PC革新端侧AI交互体验》。 &#xff08;报告出品方&#xff1a;华创证券&#xff09; 报告共计&#xff1a;28页 点击添加图片描述&#xff08;最多60个字&#xff09;编辑 一、硬件端…

mybatis多表映射-对多关联

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …

【SpringBoot教程】SpringBoot 实现前后端分离的跨域访问(CORS)

作者简介&#xff1a;大家好&#xff0c;我是撸代码的羊驼&#xff0c;前阿里巴巴架构师&#xff0c;现某互联网公司CTO 联系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗…

xtts和ogg不选择?

不选择ogg的理由&#xff1a; 1.需要在源端创建用户赋权&#xff0c;启用数据库最小日志&#xff0c;附加日志等操作--对生产影响较大 2.外键约束过多&#xff0c;割接启用可能很慢https://www.modb.pro/db/201126--割接停机时间影响 3.初始化配置expdp导出可能快照过旧&#x…

基于Java swing的医院信息管理系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

秒级监控、精准迅速:全面保障业务可用性 | 开源日报 No.101

louislam/uptime-kuma Stars: 41.1k License: MIT Uptime Kuma 是一个易于使用的自托管监控工具&#xff0c;主要功能和核心优势包括&#xff1a; 监控 HTTP(s) / TCP / HTTP(s) 关键词 / HTTP(s) Json 查询 / Ping / DNS 记录等服务的可用性提供时尚、响应迅速且良好用户体验…

docker配置连接harbor私有仓库

一、前言 以下分为两种情况说明docker对harbor私有仓库的访问配置&#xff0c;一种是harbor使用自建证书配置https&#xff0c;一种是使用公有证书配置https 二、docker配置 harbor使用自建证书的情况 使用自建证书对harbor进行https配置&#xff0c;docker会将该仓库识别成不…

客服工单系统推荐:哪个最适合您?

客服工单系统是企业的业务过程的“保安”&#xff0c;保障业务流程的顺利开展&#xff0c;同时保障企业客户的权益。所以&#xff0c;市场上有越来越多的企业纷纷配置了客服工单系统&#xff0c;以提供客户服务质量。 对于有购买意向的中小企业来讲&#xff0c;需要关注哪些因…

pycharm中py文件设置参数

在py文件中右键 直接对应复制进去即可

供应链管理痛点大解析!内附解决方案

供应链是指涉及产品或服务生产、运输、分销和最终交付给客户的过程。 用一个汽车制造的例子来帮助大家理解&#xff1a; 原材料采购&#xff1a; 汽车制造商需要从供应商处采购制造汽车所需的原材料&#xff0c;例如金属、橡胶、塑料和玻璃。生产制造&#xff1a;获得原材料&…

关于mysql高版本使用groupby导致的报错

在开发时&#xff0c;遇到mysql版本在5.7.X及以上版本时使用group by 语句会报以下的错误 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column business_typ…

班级管理的重要性

班级管理&#xff0c;就像是一座桥&#xff0c;连接着学生和老师&#xff0c;它的重要性不言而喻。 营造良好的学习氛围 班级管理不仅仅是维护秩序&#xff0c;更是营造一个积极向上的学习氛围。一个好的班级管理&#xff0c;能让学生更加专注于学习&#xff0c;提高学习效率。…

Stable Diffusion WebUI训练Lora测试XYZ显示例图

方式一 1.1 选择模型放入目录 将模型放入sd项目的models\Lora\目录,尽量保持和其他模型分开。 sd中显示如下: 1.2 脚本X/Y/Zplot选择 X轴类型:提示词搜索/替换 X轴值:NUM,000001,000002, 000003, 000004, 000005, 000006, 000007, 000008, 000009, 000010 Y轴类型:提…

[MySQL] SQL优化之性能分析

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、索引优化 1、索引是什么&#xff1a; 2、索引的数据结构&#xff1a; 3、索引种类&#xff1a; 4、sql分析&#xff08;回表查询&#xff09; 二、定位慢查询语句 1、慢查询日志 2、profile详情 3、…

数字化合纵连横:跨境电商的多维商业布局

跨境电商在数字化时代崛起&#xff0c;不再局限于传统的边界&#xff0c;而是通过数字化手段实现了合纵连横的多维商业布局。这种布局不仅推动了国际贸易的创新&#xff0c;也为企业在全球范围内发展提供了更为广阔的空间。本文将深入探讨跨境电商如何通过数字化手段实现合纵连…

Android:The emulator process for AVD Pixel_2_API_29 was killed

The emulator process for AVD Pixel_2_API_29 was killed 报错描述&#xff1a; 第一次安装Android studio好不容易解决gradle启动模拟器又出现了以下错误 The emulator process for AVD Pixel_2_API_29 was killed原因一&#xff1a; 需要安装Intel x86 Emulator Acceleer…

【C语言快速学习基础篇】之二控制语句、循环语句

文章目录 一、控制语句1.1、if...else...单条件语句1.2、if...else if...else...多条件语句1.3、switch...case 二、循环语句2.1、for循环2.2、while循环2.3、注意&#xff1a;for循环和while循环使用上面等同2.4、do while循环2.4.1、while条件成立时2.4.2、while条件不成立时…

2023年【广东省安全员C证第四批(专职安全生产管理人员)】考试题及广东省安全员C证第四批(专职安全生产管理人员)报名考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;考试题参考答案及广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及广东省安…