Go基本数据类型及内置函数(一文稳定基础)

文章目录

  • 1. 基础数据类型
  • 2.内置函数
  • 3.函数
  • 4.列表操作及for循环
  • 5.原子性操作
  • 6.通道
  • 7.协程与并发安全
  • 8.定时器

1. 基础数据类型

	1. bool:布尔类型,只有 truefalse 两个值。var test2 bool = true2. string:字符串类型,表示一组字符序列。var test2 string = "GO从入门到入坑"3. intint8int16int32int64:整数类型,分别表示有符号整数类型的不同大小(表示可以为负数)var test3 int = -6664. uintuint8uint16uint32uint64:无符号整数类型,分别表示无符号整数类型的不同大小(表示不能为负数)。var test4 uint = 7775. uintptr:无符号整数类型,用于存储指针。var x int = 10var p uintptr = uintptr(unsafe.Pointer(&x))fmt.Printf("x = %d, p = %d\n", x, p)// 	这句话是将一个普通的变量 x 的指针地址转换为 uintptr 类型的无符号整数,然后再将其转换为 unsafe.Pointer 类型的指针。这个过程通常被称为指针的类型转换或强制类型转换。6. float32float64:浮点数类型,分别表示单精度和双精度浮点数。var test5 float32 = 3.147. complex64complex128:复数类型,分别表示具有 float32float64 组件的复数值。// complex 函数是Go语言中的一个内置函数,用于创建一个复数值。它接受两个参数,分别表示复数的实部和虚部,返回一个 complex128 类型的复数值。var realpart float32 = 1.24var imagpart float32 = 2.34var c complex64 = complex(realpart, imagpart)// 输出 (1.24+2.34i) // (1.24+2.34i) 表示一个复数值,其中实部为 1.24,虚部为 2.34i。在复数中,i 表示虚数单位,即 i²=-1。因此,2.34i 表示一个虚部为 2.34 的复数。8. 字符型(runebytevar test6 rune = 'A'// 输出  65  在ASCII码中,字符 'A' 的代码点是十进制数 658.map字典m := map[string]int{"foo": 1, "bar": 2, "baz": 3}9.Pointer指针//	指针用于存储变量的内存地址。指针类型在 Go 语言中是一种基本数据类型,它允许程序直接访问和修改变量的内存地址,从而可以实现对变量的间接操作。x := 10p := &x // 获取 x 的地址fmt.Println(x, p)fmt.Println(*p) // 输出 10,*p 表示访问指针 p 所指向的变量的值*p = 20        // 修改指针 p 所指向的变量的值为 20,即修改变量 x 的值为 20fmt.Println(x) // 输出 20

2.内置函数

	1.len:返回传入参数的长度,如字符串、数组、切片、字典或通道等。l := []int{1, 2, 3, 4, 5, 6}fmt.Println(len(l))		// 输出 62.cap:返回传入参数的容量,如切片或数组等。l := []int{1, 2, 3, 4, 5, 6}fmt.Println(cap(l))		// 输出 6 2.make:用于创建动态类型的值,如切片、映射、通道等。//创建切片m := make([]int, 3, 5)	// 一个长度为 3、容量为 5 的整型切片,并初始化所有元素为 0,当切片的长度超过其容量时,切片会自动扩容fmt.Println(m)		   // 输出 [0 0 0]//创建映射m := make(map[T1]T2, capacity)	//T1表示映射的键类型,T2表示映射的值类型,capacity表示映射的容量。									    capacity是可选参数,如果省略,则默认为0。m := make(map[string]int, 10)	// 创建一个容量为10的字符串到整型的映射// 创建通道ch := make(chan T, capacity)	// T表示通道中元素的类型,capacity表示通道的容量。capacity是可选											参数,如果省略,则默认为0。ch := make(chan string, 10)		//创建一个容量为10的字符串通道3.append:用于将元素追加到切片中。qq := []int{1, 7, 1, 1, 0, 3}qq = append(qq, 1, 0, 0, 6)fmt.Println(qq)		  // 追加尾部 [1 7 1 1 0 3 1 0 0 6]4.copy:用于将一个切片的内容复制到另一个切片中。qq := []int{1, 7, 1, 1, 0, 3}ql := []int{1, 0, 0, 6}ll := copy(qq, ql)fmt.Println(ll) // 输出 4fmt.Println(qq)	// 输出 [1 0 0 6 0 3]  如果ql是空则完全赋值qq 如果ql不是空则保留ql已有的加上qq对应的后续(ql四位数保留 复制qq第五位开始)5.close:用于关闭通道。ch := make(chan int)go func() {for i := 0; i < 5; i++ {ch <- i // 使用通道操作符 <- 向通道 ch 发送一个整数值 i}close(ch) // 关闭通道}()for n := range ch { // 循环ch 赋值n打印fmt.Println(n)}6.panicrecover:用于处理程序中的异常情况。引发一个运行时恐慌,v 可以是任何值。	func main(){	fmt.Println("start")		// 1doSomething()				// 2fmt.Println("end")}func doSomething() {fmt.Println("Doing something")	// 3panic("Error!")				// 4 结束当前程序 不继续向下运行调出栈信息}// 输出   start//        Doing something//        panic: Error!//        goroutine 1 [running]://        main.doSomething(...)//                D:/one/基础数据类型.go:122//        main.main()//                D:/one/基础数据类型.go:116 +0xa8// 程序在执行 doSomething 函数时发生了 panic,并输出了一个字符串 "Error!"。在这种情况下,程序会立即退出,并打印出调用栈信息,以便开发人员进行调试和排查问题。7.printprintln、printf:用于将给定的参数打印到控制台。a := "hello"b := 123fmt.Print(a, b) // 输出:hello123 Print函数用于将指定的参数打印到标准输出中,不会自动换行。a := "hello"b := 123fmt.Println(a, b) // 输出:hello 123\n Println函数用于将指定的参数打印到标准输出中,会自动换行。a := "hello"b := 123fmt.Printf("%s %d", a, b) // 输出:hello 123	printf用于fmt字符串 %s字符串 %d数字8.new:返回一个类型为 T 的指针,指向一个新分配的零值,并返回其地址。p := new(int) // 创建一个int类型的零值对象,并返回其地址fmt.Println(*p) // 输出:0*p = 123 // 通过指针修改对象的值fmt.Println(*p) // 输出:1239.delete(m, key):从映射 m 中删除键值为 key 的元素。m := map[string]int{"a": 1, "b": 2, "c": 3}delete(m, "b") // 删除键为"b"的键值对fmt.Println(m) // 输出:map[a:1 c:3]

3.函数

	1. 无参函数func function1() {fmt.Println("无参函数 直接调用")}	// 调用 function1()func function2() int {return 666 // 返回一个指定类型参数}// 	res := function3()//  fmt.Println(res)//  or //  fmt.Println(function3())2. 有参函数func function3(a, b int, c string) {fmt.Println("有参函数 指定类型依次传入")}// function2(1, 2, "真6")func function4(a, b int) (int, int) {return a + b, b * a // 返回两个参数}// fmt.Println(function4(22, 33))3. 递归调用func function5() {fmt.Println("6666")function5() // 递归调用 函数调用自己本身}// function5()4. 定义函数属性类型type Books struct {title  string // 定义函数属性类型author string}//	var onebook Books//	onebook.title = "Go 好扯淡" // 函数 .操作属性//	onebook.author = "Mr.Mei"//	fmt.Println(onebook.title, onebook.author)//	fmt.Println(len(onebook.author))5. 占位符func GetData() (int, string) {return 10, "hello"}//	a, _ := GetData() //  _, b := GetData()//  fmt.Println(a, b)

4.列表操作及for循环

	list := []int{123, 456, 789, 111}  // 定义列表list = append([]int{555}, list...) // 头部追加 ... == copylist = append(list, 222)           // 列表尾部追加 appendfmt.Println(list)for i, v := range list { // for循环 i所引 v valuefmt.Println(i, v)}

5.原子性操作

	package mainimport ("fmt""sync/atomic""time")func main() {var cnt uint32 = 0// 运行10次for i := 0; i < 10; i++ {// 执行匿名函数go func() {// 从10循环到199 每次sleep一毫秒时间 去原子操作 cntfor i := 10; i < 200; i++ {time.Sleep(time.Millisecond)atomic.AddUint32(&cnt, 1)}}()}time.Sleep(time.Second)// 原子读取 赋值cntFinal := atomic.LoadUint32(&cnt)fmt.Println("cnt:", cntFinal)}

6.通道

	package mainimport "fmt"func hello(done chan bool) {fmt.Println("Hello Goroutine")done <- true}func main() {done := make(chan bool)go hello(done)<-donefmt.Println("main function")}

7.协程与并发安全

	package mainimport ("fmt""math/rand""runtime""sync"_ "sync""time")var total int32 = 10var mutex sync.Mutexvar wg sync.WaitGroup//	func sell(i int) {//		for {//			if total > 0 {//				// 模拟延迟//				time.Sleep(time.Duration(rand.Intn(5)) * time.Millisecond)//				total--//				fmt.Println("id:", i, "  ticket:", total)//			} else {//				break//			}//		}//	}func sell(i int) {for total > 0 {mutex.Lock()if total > 0 {time.Sleep(time.Duration(rand.Intn(5)) * time.Millisecond)total--fmt.Println("id:", i, "  ticket:", total)}mutex.Unlock()}wg.Done()}func main() {// 设置CPU核心数 影响并发性能runtime.GOMAXPROCS(8)// 设置随机数种子 免随机生成的数字一样 当前使用时间戳rand.Seed(time.Now().Unix())wg.Add(5)// 使用for循环 如果i<5 i++ 当前i=0for i := 0; i < 5; i++ {go sell(i)}// 等待线程结束 查看当前票数wg.Wait()fmt.Println(total, "Done")}

8.定时器

	package mainimport ("fmt""time")func main() {ticker := time.NewTicker(time.Second) // 每隔1秒向其通道发送一个时间事件go func() {for t := range ticker.C {fmt.Println(t) // 使用for循环打印ticker.c通道的时间事件}}()timer := time.NewTimer(10 * time.Second) // 创建一个10秒的定时器,并将其赋值给变量timer<-timer.C                                // timer.C通道中接收一个时间事件 该操作会阻塞当前goroutine,直到定时器到期并发送时间事件.ticker.Stop()                            // 停止ticker定期发送时间事件。并输出一条信息表示定时器已经到期。 ticker.C通道已经关闭退出循环fmt.Println("timer expired!")}/*该代码实现了每秒钟打印一个时间戳,并在10秒钟后停止。在该代码运行期间,程序会一直处于运行状态,直到定时器到期并停止Ticker。该代码使用了goroutine和channel,可以保证每秒钟打印时间戳的同时,可以在10秒钟后及时停止Ticker,并且不会阻塞主线程。*///2023-07-20 16:24:54.7060075 +0800 CST m=+5.008210801//2023-07-20 16:24:55.7068004 +0800 CST m=+6.009003701//2023-07-20 16:24:56.7066918 +0800 CST m=+7.008895101//2023-07-20 16:24:57.7022063 +0800 CST m=+8.004409601//2023-07-20 16:24:58.7061753 +0800 CST m=+9.008378601//timer expired!

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

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

相关文章

微服务网关

1.网关是如何演化来的&#xff0c;在微服务中有什么作用&#xff1f; 随着单体架构转化为微服务架构的时候&#xff0c;由一个后台服务由一个单一的服务变成了多个微服务&#xff0c;前端应用需要调用多个服务的接口&#xff0c;为了解决这个问题&#xff0c;网关就产生了。网…

【LeetCode】55.跳跃游戏

题目 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1&#xff1a; 输入&#xff1a;nums [2,3,1,1,4] 输出&#xff1a;true 解释&#xff1a;可以…

一个月学通Python(二十六):Django使用缓存

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教程(0基础)》 文章目录 专栏介绍使用缓存Django项目接入Redis为视图提供缓…

Flask 文件上传,删除上传的文件

目录结构 app.py from flask import Flask, request, render_template, redirect, url_for import osapp Flask(__name__) BASE_DIR os.getcwd() UPLOAD_FOLDER os.path.join(BASE_DIR, testfile)app.route(/) def home():files os.listdir(UPLOAD_FOLDER)return render_t…

欧盟新规,燃油噩梦?2025年起,高速公路每60公里设立一处快充站

根据外媒The Verge报道&#xff0c;欧洲电动汽车用户将获得更多便捷的待遇&#xff0c;同时还能减少有害温室气体排放&#xff0c;这得益于欧盟理事会最新通过的法规。 根据欧盟的法规要求&#xff0c;自2025年起&#xff0c;TEN-T高速公路系统在欧洲将需要每隔60公里设立一座高…

Langchain 和 Chroma 的集成

Langchain 和 Chroma 的集成 1. Chroma2. 基本示例​3. 基本示例(包括保存到磁盘)4. 将 Chroma Client 传递到 Langchain ​5. 基本示例(使用 Docker 容器)6. 更新和删除7. 带分数的相似性搜索​ 1. Chroma Chroma 是一个人工智能原生开源矢量数据库&#xff0c;专注于开发人员…

ES6基础知识六:你是怎么理解ES6中 Promise的?使用场景?

一、介绍 Promise&#xff0c;译为承诺&#xff0c;是异步编程的一种解决方案&#xff0c;比传统的解决方案&#xff08;回调函数&#xff09;更加合理和更加强大 在以往我们如果处理多层异步操作&#xff0c;我们往往会像下面那样编写我们的代码 doSomething(function(resu…

[ 容器 ] Harbor 私有仓库的部署与管理

目录 一、什么是Harbor二、Harbor的特性三、Harbor的构成四、Harbor 部署五、关于 Harbor.cfg 配置文件中有两类参数&#xff1a;所需参数和可选参数六、维护管理Harbor 一、什么是Harbor Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户…

jQuery的DOM操作之笔记总结

jQuery的DOM操作之笔记总结 首先我们来介绍一下什么是DOM 简述&#xff1a; 1.DOM全称Document Object Model&#xff08;文档对象模型&#xff09;。 2.每个文档都是一棵DOM结构的树&#xff0c;文档里的很多元素&#xff0c;就像树上的很多节点&#xff0c;或是分叉的树枝…

知识库数据导出为excel-使用JavaScript实现在浏览器中导出Excel文件

我们智能客服知识库机器人已经开发完成&#xff0c;后端数据库是使用的qdrant向量数据库&#xff0c;但是该数据库并没有导出备份功能&#xff0c;所以我按简单的纯前端实现知识库导出excel数据 使用第三方库(如SheetJS) SheetJS是一个流行的JavaScript库&#xff0c;可帮助处理…

腾讯云 Cloud Studio 实战训练营——快速构建React完成点餐H5页面

目录 ​编辑 一、前言 1、什么是腾讯云 Cloud Studio 2、本文实验介绍 二、前期准备工作 1、注册 Cloud Studio 2、初始化工作空间 三、开发一个简版的点餐系统页面 1、安装依赖 1.1、安装 antd-mobile 1.2、安装 less 和 less-loader 1.3、暴露 webpack 配置文件 …

OpenCV实现照片换底色处理

目录 1.导言 2.引言 3.代码分析 4.优化改进 5.总结 1.导言 在图像处理领域&#xff0c;OpenCV是一款强大而广泛应用的开源库&#xff0c;能够提供丰富的图像处理和计算机视觉功能。本篇博客将介绍如何利用Qt 编辑器调用OpenCV库对照片进行换底色处理&#xff0c;实现更加…

Stable Diffusion生成艺术二维码

Stable Diffusion生成艺术二维码 文章会有浏览问题&#xff0c;点击此处查看原文 首先需要一个Stable Diffusion服务环境&#xff0c;《Stable Diffusion服务环境搭建&#xff08;远程服务版&#xff09;》如果你已经有了那就忽略 一、准备一个比较好的二维码底图 首先解析二…

STC12C5A系列单片机片内看门狗的应用

wdt.c #include "wdt.h"void wdt_init(void) {WDT_CONTR 0x24; // 0010 0100 - 1.1377s }void wdt_feed(void) {WDT_CONTR | 0x10; // 喂狗 }wdt.h #ifndef _WDT_H_ #define _WDT_H_#include "stc12c5a60s2.h"// 函数声明 extern void wdt_init(void); …

uniapp开启消息通知/提示(使用uniPush)

亲爱的小伙伴们&#xff0c;最近对uniPush有稍许研究&#xff0c;当前研究出一些心得&#xff0c;现在分项给大家&#xff0c;希望对大家的uniapp之路有所帮助。本次的教程是教会你如何使用uniPush自定义消息通知&#xff0c;同时还附带添加消息提示音添加&#xff0c;多的不说…

Vue源码学习 - new Vue初始化都做了什么?

目录 前言一、创建一个 Vue 实例二、找到 Vue 构造函数三、源码分析 - Vue.prototype._init四、源码分析 - 调用 $mount 方法&#xff0c;进入挂载阶段五、总结 前言 使用Vue也有一段时间了&#xff0c;最近去阅读了Vue的源码&#xff0c;想总结分享下学到的新东西。 如果觉得…

【Spring MVC学习】连接 接收请求参数 响应返回参数

目录 前言&#xff1a;认识Spring MVC &#x1f337;1、什么是MVC&#xff1f; 一、建立连接&#xff08;5个注解&#xff09; &#x1f337;1、RequestMapping注解:注册接⼝的路由映射&#xff08;默认返回页面&#xff09; &#x1f337;2、ResponseBody注解&#xff1a…

Java可变参数

一、基本概念 Java允许将同一个类中多个同名同功能但参数个数不同的方法&#xff0c;封装成一个方法。 二、基本语法 访问修饰符 返回类型方法名(数据类型... 形参名){ }三、注意事项 可变参数的实参可以为0个或者任意多个&#xff1b; 可变参数的实参可以为数据&#xff1…

unity调用c++dll时变量处理问题

在C中为了处理方便可以将有些局部变量变为全局变量。 以下面三个变量为例 如果还有新全局变量需要这其来赋值&#xff0c;就会有问题。 如下面的body1_ptr为了dll生成处理方便&#xff0c;变为全局变量后&#xff0c;这个指针变赋值就会有问题。 因为geometry_path这个只在调…

Ubuntu22.04上部署Lua开发环境

需求背景 想在Ubuntu22.04上搭建一下Lua的开发环境&#xff0c;其实步骤比较简单的&#xff0c;此文章也适用于Ubuntu主机环境搭建Lua,如果想在在Ubuntu内部署一个容器&#xff0c;然后在容器内搭建Lua的环境&#xff0c;可以先参考容器的创建过程 ubuntu22.04上如何创建有pri…