Go学习-Day4

文章目录

  • Go学习-Day4
    • 函数
      • 值传递,引用传递
      • 常用的函数
    • 异常处理
    • 数组
    • Slice切片

Go学习-Day4

  • 个人博客:CSDN博客

函数

值传递,引用传递

  • 值传递直接拷贝值,一般是基本数据类型,数组,结构体也是
  • 引用传递传递地址 ,效率高,指针,slice切片,map,管道,interface等

常用的函数

  • len(string str)//求字符串长度,自带的不用包,中文一个字三字节
    
  • 转成[]rune来处理

  • []byte转string

  • str = string([]byte{...})
    
  • 查找子串是否存在

  • 若干字符函数

  • strings.Contains("aaa", "aaa") //bool
    strings.Index("aaa", "aaa")//返回下标
    strings.LastIndex("aaa", "aaa")//返回最后一个下标,没有就返回-1
    strings.Replace(str, str1, str2, n)//把1中str1替换成str2,n是替换个数,-1表示全部替换
    strings.Split(str, "某字符")//分割字符串
    strings.TrimSpace(str)//裁剪空格,去掉前导和后导空格
    strings.Trim(str, "字符集")//去掉指定字符
    strings.TrimLeft()//同上,去掉左侧,并且还有TrimRight
    strings.HasPrefix(str, "后缀")//前缀匹配
    strings.HasSuffix()//同上,但是后缀
    
  • 若干时间函数

  • now := time.Now()//返回时间类型,当前时间
    //2023-08-23 16:37:07.5402748 +0800 CST m=+0.001148901 大概是这样
    //时间类型是结构体,可以使用.运算符来获取其他时间信息,now.Year()
    //月份可以直接转int
    time.Sleep(time.Millisecond * 100)//只能用乘法,不能有浮点数,利用时间单位常量
    time.Unix()//获取unix秒时间戳
    time.UnixNano()//unix纳秒时间戳
    
  • 内置函数built-in

  • len()//统计字符串长度,数组大小
    new(Type) *Type //参数为类型,返回一块对应大小的清空的内存块的指针
    

异常处理

  • Go中没有try catch

  • Go利用defer panic recover来处理异常

  • 抛出一个panic的异常,在defer中通过recover捕获异常

  • package mainimport "fmt"func test() {defer func() {err := recover() //捕获异常if err != nil {fmt.Println(err)}}()num1 := 10num2 := 0res := num1 / num2fmt.Println(res)
    }
    func main() {test()fmt.Println("ok")
    }
  • 通过捕获异常,可以使得程序不崩溃停止!main函数的其他部分照常运行

  • 自定义错误

  • func myError(x int) (err error) {if x == 0 {return nil} else {return errors.New("错误")}
    }func test() {err := myError(1)if err != nil {panic(err)}
    }func main() {test()
    }
    
  • panic会终止程序

  • 捕获自定义错误

  • func myError(x int) (err error) {if x == 0 {return nil} else {return errors.New("错误")}
    }func test() {defer func() {err := recover() //捕获异常if err != nil {fmt.Println(err)}}()err := myError(1)if err != nil {panic(err)}
    }func main() {test()fmt.Println("ok")
    }
    

数组

  • 定义

  • func main() {var arr [10]intarr[0] = 1fmt.Println(arr)}
    
  • 数组名地址&arr

  • 初始化

  • var arr [3]int = [3]int{1, 2, 3}var arr = [3]int{1, 2, 3}var arr = [...]int{1, 2, 3}var arr = [...]int{1: 800, 0: 900, 2: 999}//指定下标var arr := [...]int{1, 2, 3} //自动推导
    
  • 遍历for-range 同string 不赘述

  • 数组中的元素可以是任何合法的类型,但是不能混用

  • Go中数组是值类型,会进行拷贝,要想修改原数组,需要使用指针,写法类似C语言的行指针

Slice切片

  • 切片是引用类型,传递地址

  • 切片和数组类似,但是长度是可以变化的!

  • 声明

  • var a []int
    
  • func main() {var arr [5]int = [...]int{1, 2, 3, 4, 5}slice := arr[1:3] //从下标1与下标3,左闭右开的区间fmt.Println(slice)
    }
    
  • 通过make声明

  • func main() {slice := make([]int, 2, 4)fmt.Println(slice)
    }
    
  • make在底层维护一个数组,这个数组对外不可见

  • 直接声明

  • var slive []string = []string 
    
  • 遍历和数组类似,不再赘述

  • 简写

  • var slice = arr[:end] // var slice = arr[0:end]前缀,不含end
    var slice = arr[start:]//var slice = arr[start:]后缀
    var slice = arr[:]//var slice = arr[0:len(arr)]全长
    
  • 切片可以继续切片

  • 切片可以追加,可以追加多个数,可以追加多个切片,利用append将追加后的切片赋值给原来的切片

  • slice1 = append(slice1, 1, 2, 3)//追加数
    slice1 = append(slice1, slice1...)//要三个点
    
  • Go底层会创建一个新的数组,然后切片这个新的数组,这些过程均不可见

  • string可以进行切片处理

  • str := "sssssss"
    slice := str[2:]//从下标2开始切后缀
    
  • string底层也指向一个byte数组,我们用切片来拷贝这个只读的byte数组再进行操作

  • 通过切片能够改变字符串

  • arr := byte[](str)
    arr[0] = 'a'
    str = string(arr)
    //但是不支持中文
    arr := rune[](str)
    arr[0] = '好'
    str = string(arr)
    //弄中文
    func main() {str := "?????"arr := []rune(str)arr[0] = '好'fmt.Println(string(arr))
    }
    

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

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

相关文章

【程序员必知必会2】中英文混合超长字符串如何截断(C++)

背景 用户输入的搜索关键词可能是包含中英文、特殊字符混合的字符串,如果长度超长,可能会导致下游服务的报错,需要提前对keyword做截断。 版本一 (只考虑中英文) bool CutOff(std::string keyword){int query_length keyword.length();// …

网络编程 http 相关基础概念

文章目录 表单是什么http请求是什么http请求的结构和说明关于http方法 GET和POST区别http常见状态码http响应http 请求是无状态的含义html是什么 (前端内容,了解即可)html 常见标签 (前端内容,了解即可)关于…

App卡帧与BlockCanary

作者:图个喜庆 一,前言 app卡帧一直是性能优化的一个重要方面,虽然现在手机硬件性能越来越高,明显的卡帧现象越来越少,但是了解卡帧相关的知识还是非常有必要的。 本文分两部分从app卡帧的原理出发,讨论屏…

Mainline Linux 和 U-Boot编译

By Toradex胡珊逢 Toradex 自从 Linux BSP v6 开始在使用 32位处理器的 Arm 模块如 iMX6、iMX6ULL、iMX7 上提供 mainline/upstream kernel ,部分 64位处理器模块如 Verdin iMX8M Mini/Plus 也提供实验性支持。文章将以季度发布版本 Linux BSP V6.3.0 为例介绍如何下…

detour编译问题及导入visual studio

Detours是经过微软认证的一个开源Hook库,Detours在GitHub上,网址为 https://github.com/Microsoft/Detours 注意版本不一样的话也是会出问题的,因为我之前是vs2022的所以之前的detours.lib不能使用,必须用对应版本的x64 Native To…

python的安装(推荐)

torch安装与卸载推荐链接1推荐链接2 推荐链接3 安装pytorch步骤推荐链接 python关键字:

Java简单算法题(面试准备)

一、两数之和 public int[] twoSum(int[] nums, int target) {for (int i 0; i < nums.length; i) {for (int j i 1; j < nums.length; j) {if (nums[i] nums[j] target) {return new int[]{i, j};}}}throw new IllegalArgumentException("No two sum solutio…

4 hadoop集群配置案例

3&#xff09;配置集群 &#xff08;1&#xff09;核心配置文件&#xff0c;core-site.xml cd $HADOOP_HOME/etc/hadoopvim core-site.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <?xml-stylesheet type"text…

数据库概述

目录 数据库 数据库的基本概念 数据 表 数据库 数据库管理系统 数据库系统 DBMS的主要功能 DBMS的工作模式 ​编辑 数据库的发展 数据库类型 关系数据库 关系数据库的构成 非关系数据库 非关系型数据库的优点 关系型数据库与非关系型数据库的区别 数据库 数据库…

Flink流批一体计算(16):PyFlink DataStream API

目录 概述 Pipeline Dataflow 代码示例WorldCount.py 执行脚本WorldCount.py 概述 Apache Flink 提供了 DataStream API&#xff0c;用于构建健壮的、有状态的流式应用程序。它提供了对状态和时间细粒度控制&#xff0c;从而允许实现高级事件驱动系统。 用户实现的Flink程…

Ubuntu安装RabbitMQ

一、安装 更新系统软件包列表&#xff1a; sudo apt update安装RabbitMQ的依赖组件和GPG密钥&#xff1a; sudo apt install -y curl gnupg curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo gpg --dearmo…

半导体制造常用软件工具总结

半导体制造常用软件工具总结 CIM&#xff1a;Computer Integrated Manufacturing 设备自动化&#xff0c;总称MES&#xff1a;Manufacturing Execution System 制造执行系统EAP&#xff1a;Equipment Automation Programming 设备自动化&#xff0c;是MES与设备的桥梁APC&…

暴力递归转动态规划(二)

上一篇已经简单的介绍了暴力递归如何转动态规划&#xff0c;如果在暴力递归的过程中发现子过程中有重复解的情况&#xff0c;则证明这个暴力递归可以转化成动态规划。 这篇帖子会继续暴力递归转化动态规划的练习&#xff0c;这道题有点难度。 题目 给定一个整型数组arr[]&…

用心维护好电脑,提高学习工作效率

文章目录 一、我的电脑1.1 如何查看自己的电脑硬件信息呢&#xff1f; 二、电脑标准保养步骤和建议2.1 保持清洁2.2 定期升级系统和软件2.3 安全防护2.4 清理磁盘空间2.5 备份重要数据2.6 优化启动项2.7 散热管理2.8 硬件维护2.9 电源管理2.10 注意下载和安装2.11 定期维护 三、…

Web开发

什么是Web&#xff1f; Web&#xff1a;全球广域网&#xff0c;也称万维网&#xff08;www World Wide Web&#xff09;&#xff0c;能够通过浏览器访问的网站 Web网站的工作流程&#xff1a; 浏览器------&#xff08;请求&#xff09;--------前端服务器------&#xff08;相…

C++语法基础

这里写目录标题 基础语法第一个程序变量常量的定义关键字标识符命名 &#xff08;变量命名&#xff09;sizeof的使用实型&#xff08;浮点型&#xff09;字符型转义字符字符串的定义 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 基础语法 第一个程序 …

python编程中fft的优缺点,以及如何使用cuda编程,cuda并行运算,信号处理(推荐)

A.python中cuda编程的库主要有: cupy、pycuda 1,区别如下: 支持的GPU平台: PyCUDA:PyCUDA是一个用于在Python中编写CUDA代码的库。它支持NVIDIA的CUDA平台,并提供了与CUDA C/C++接口相似的功能。因此,PyCUDA主要用于与NVIDIA GPU交互的应用。 CuPy:CuPy是一个用于在P…

研究发现,可以很随意地破解破越狱ChatGPT、Bard和Claude的安全限制措施

最新研究发现&#xff0c;可以很随意地破解ChatGPT、Bard和Claude等主流AI系统的安全限制措施。 卡内基梅隆大学和旧金山AI安全中心的研究人员在最新报告中表示&#xff0c;他们已经发现了潜在的多种方法来突破主流AI聊天机器人的安全限制。 ChatGPT、Bard和Claude等语言模型…

用 PHP 和 JavaScript 显示地球卫星照片

向日葵 8 号气象卫星是日本宇宙航空研究开发机构设计制造的向日葵系列卫星之一&#xff0c;重约 3500 公斤&#xff0c;设计寿命 15 年以上。该卫星于 2014 年 10 月 7 日由 H2A 火箭搭载发射成功&#xff0c;主要用于监测暴雨云团、台风动向以及持续喷发活动的火山等防灾领域。…