Go-学会string的基本使用

本节重点:

  • 学会 sting 的基本使用

字符串在 Go 中值得特别提及,因为与其他语言相比,string 的实现方式同其他语言略有不同。

什么是字符串?

字符串是 Go 中的字节切片。可以通过将一组字符括在双引号中来创建字符串" "

让我们看个创建string并打印它的简单示例。

package mainimport (  "fmt"
)func main() {  web := "https:www.gotribe.cn"fmt.Println(web)
}

上面的程序将打印https:www.gotribe.cn.
Go 中的字符串是兼容Unicode编码的,并且是UTF-8编码的。

访问字符串的单个字节

由于字符串是字节切片,因此可以访问字符串的每个字节。

package mainimport (  "fmt"
)func printBytes(s string) {  fmt.Printf("Bytes: ")for i := 0; i < len(s); i++ {fmt.Printf("%x ", s[i])}
}func main() {  web := "https:www.gotribe.cn"fmt.Printf("String: %s\n", web)printBytes(web)
}

%s 是打印字符串的格式说明符。在16行号,打印输入字符串。在上面程序的第9 行中,len(s) 返回字符串中的字节数,我们使用for 循环以十六进制格式符打印这些字节。%x是十六进制的格式说明符。上述程序输出

String: https:www.gotribe.cn
Bytes: 68 74 74 70 73 3a 77 77 77 2e 67 6f 74 72 69 62 65 2e 63 6e

访问字符串的单个字符

我们稍微修改一下上面的程序来打印字符串的字符。

package mainimport ("fmt"
)func printBytes(s string) {fmt.Printf("Bytes: ")for i := 0; i < len(s); i++ {fmt.Printf("%x ", s[i])}
}func printChars(s string) {fmt.Printf("Characters: ")for i := 0; i < len(s); i++ {fmt.Printf("%c ", s[i])}
}func main() {web := "https:www.gotribe.cn"fmt.Printf("String: %s\n", web)printBytes(web)fmt.Printf("\n")printChars(web)
}

在上面程序的第 17 行, %c 格式说明符用于在printChars方法中打印字符串的字符。程序打印:

String: https:www.gotribe.cn
Bytes: 68 74 74 70 73 3a 77 77 77 2e 67 6f 74 72 69 62 65 2e 63 6e 
Characters: h t t p s : w w w . g o t r i b e . c n

上面的程序看起来像是访问字符串中单个字符的合法方式,但它有一个严重的错误。让我们找出那个错误是什么。

package mainimport ("fmt"
)func printBytes(s string) {fmt.Printf("Bytes: ")for i := 0; i < len(s); i++ {fmt.Printf("%x ", s[i])}
}func printChars(s string) {fmt.Printf("Characters: ")for i := 0; i < len(s); i++ {fmt.Printf("%c ", s[i])}
}func main() {web := "https:www.gotribe.cn"fmt.Printf("String: %s\n", web)printBytes(web)fmt.Printf("\n")printChars(web)fmt.Printf("\n\n")web = "Señor"fmt.Printf("String: %s\n", web)printBytes(web)fmt.Printf("\n")printChars(web)
}

上述程序的输出是

String: https:www.gotribe.cn
Bytes: 68 74 74 70 73 3a 77 77 77 2e 67 6f 74 72 69 62 65 2e 63 6e 
Characters: h t t p s : w w w . g o t r i b e . c n String: Señor
Bytes: 53 65 c3 b1 6f 72 
Characters: S e à ± o r

上面程序的第 33 行,我们尝试将 “Señor” 中的每个字符打印出来,但是却得到了 “Señor”。为什么这个程序在 “https:www.gotribe.cn” 上运行正常,但是不适用于 “Señor” 呢?因为 ñ 的 Unicode 码点是 U+00F1,因而它的 UTF-8 编码占了两个字节:c3 和 b1。上面的程序假定每个码点只有一个字节长度,因此会发生错误。在 UTF-8 编码中,一个码点可能会占一个以上的字节。 在这种情况下,我们需要 rune 来帮助解决问题。

rune

rune 是 Go 中的内置类型,它是 int32 的别名。Rune 表示 Go 中的 Unicode 代码点。代码点占用多少字节并不重要,它可以用一个符文来表示。让我们修改上面的程序以使用符文打印字符。

package mainimport ("fmt"
)func printBytes(s string) {fmt.Printf("Bytes: ")for i := 0; i < len(s); i++ {fmt.Printf("%x ", s[i])}
}func printChars(s string) {  fmt.Printf("Characters: ")runes := []rune(s)for i := 0; i < len(runes); i++ {fmt.Printf("%c ", runes[i])}
}
func main() {web := "https:www.gotribe.cn"fmt.Printf("String: %s\n", web)printBytes(web)fmt.Printf("\n")printChars(web)fmt.Printf("\n\n")web = "Señor"fmt.Printf("String: %s\n", web)printBytes(web)fmt.Printf("\n")printChars(web)
}

在上面的程序的 第16行 中,字符串被转换为rune切片。然后我们循环它并显示字符。输出结果为:

String: https:www.gotribe.cn
Bytes: 68 74 74 70 73 3a 77 77 77 2e 67 6f 74 72 69 62 65 2e 63 6e 
Characters: h t t p s : w w w . g o t r i b e . c n String: Señor
Bytes: 53 65 c3 b1 6f 72 
Characters: S e ñ o r

这时候结果就正确了。

字符串连接

在 Go 中有多种方法可以执行字符串连接。让我们来看看其中的几个。
执行字符串连接的最简单方法是使用+运算符。

ackage mainimport (  "fmt"
)func main() {  string1 := "Go"string2 := "is awesome"result := string1 + " " + string2fmt.Println(result)
}

在上面的程序中,第 10 行。string1与中间的空格和string2连接。该程序打印,Go is awesome
连接字符串的第二种方法是使用 fmt 包的Sprintf函数。
Sprintf函数根据输入格式说明符格式化字符串并返回结果字符串。让我们用Sprintf函数重写上面的程序。

package mainimport (  "fmt"
)func main() {  string1 := "Go"string2 := "is awesome"result := fmt.Sprintf("%s %s", string1, string2)fmt.Println(result)
}

上面程序的 第10行%s %s格式是作为Sprintf参数输入两个字符串,它们之间有一个空格。这将连接两个字符串。结果字符串存储在result中. 该程序打印,Go is awesome

注意点:

  • 字符串在 Go 中是不可变的。一旦创建了字符串,就无法更改它。
  • utf8包提供了RuneCountInString(s string) (n int)来获取字符串的长度。一些 Unicode 字符的代码点占据了超过 1 个字节。len用于找出这些字符串的长度将返回不正确的字符串长度。

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

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

相关文章

OpenTelemetry——What is OpenTelemetry

What is OpenTelemetry? 什么是 OpenTelemetry&#xff1f; A short explanation of what OpenTelemetry is and isn’t. 对 OpenTelemetry 是什么和不是什么的简短说明 OpenTelemetry is an Observability framework and toolkit designed to create and manage telemetry d…

Qt中播放GIF动画

在Qt应用程序中&#xff0c;如果你想在QLabel控件上播放GIF动画&#xff0c;可以使用QMovie类与QLabel配合来实现。以下是详细步骤和代码示例&#xff1a; 步骤1&#xff1a;引入必要的头文件 首先&#xff0c;在你的源代码文件中包含QMovie和QLabel相关的头文件&#xff1a;…

Vue组合式函数,详细解析

什么是“组合式函数”&#xff1f;​ 在 Vue 应用的概念中&#xff0c;“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。 当构建前端应用时&#xff0c;我们常常需要复用公共任务的逻辑。例如为了在不同地方格式化时间&#xff0c;我们…

AONMIX和WAKEUPMIX的区别

在 ARM 芯片中&#xff0c;术语 AONMIX 指的是 i.MX 93 处理器的输入/输出多路复用控制器。让我们来详细了解一下&#xff1a; i.MX 93 处理器&#xff1a; i.MX 93 是恩智浦半导体公司开发的一种基于 ARM 的处理器。它通常用于各种嵌入式系统和应用。 IOMUX&#xff08;输入/…

js手写并发请求控制

关键点 new promise 一经创建&#xff0c;立即执行 使用 Promise.resolve().then 可以把任务加到微任务队列&#xff0c;防止立即执行迭代方法 微任务处理过程中&#xff0c;产生的新的执行微任务&#xff0c;会在同一事件循环内&#xff0c;追加到微任务队列里 使用 race 在…

【微命令】git 如何修改某个分支的名字(git branch -m newbranch)

简要信息&#xff0c;快速记录 命令 # 切换到某个需要修改的分支 git checkout oldbranch# 修改分支名字 git branch -m newbranch假设作为git设计者&#xff0c;要用来修改branch的命令&#xff0c;那么就是 git branch作为前缀&#xff0c;然后进一步修改的命令是branch相关…

gradio简单搭建——关键词简单筛选【2024-4-11优化】

gradio简单搭建——关键词简单筛选[2024-4-11 优化] 新的思路&#xff1a;标签自动标注界面搭建优化数据处理与生成过程交互界面展示 新的思路&#xff1a;标签自动标注 针对通过关键词&#xff0c;在文本数据中体现出主体的工作类型这一任务&#xff0c;这里使用展示工具grad…

2012年认证杯SPSSPRO杯数学建模A题(第二阶段)蜘蛛网全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 A题 蜘蛛网 原题再现&#xff1a; 第二阶段问题   现在我们假设一个具体的环境。假设有一个凸多边形的区域&#xff0c;蜘蛛准备在这个区域&#xff08;或其一部分&#xff09;上结一张网。   问题一&#xff1a; 在区域的边界上安置有若干…

leetcode解题思路分析(一百五十五)1352 - 1358 题

最后 K 个数的乘积 请你实现一个「数字乘积类」ProductOfNumbers&#xff0c;要求支持下述两种方法&#xff1a; add(int num) 将数字 num 添加到当前数字列表的最后面。 getProduct(int k) 返回当前数字列表中&#xff0c;最后 k 个数字的乘积。 你可以假设当前列表中始终 至少…

HarmonyOS开发实例:【手势截屏】

介绍 本篇Codelab基于手势处理和截屏能力&#xff0c;介绍了手势截屏的实现过程。样例主要包括以下功能&#xff1a; 根据下滑手势调用全屏截图功能。全屏截图&#xff0c;同时右下角有弹窗提示截图成功。根据双击手势调用区域截图功能。区域截图&#xff0c;通过调整选择框大…

GeoServer:忘记密码重置

操作步骤 1. 找到data_dir/security/usergroup/default目录下的users.xml文件&#xff0c; 2.修改password为plain:geoserver&#xff0c; 这里无论原来的密码是什么&#xff0c;改为plain:geoserver之后&#xff0c;就可以通过admin&#xff1a;geoserver默认账户密码登录了。…

室内定位中文综述阅读

1 室内高精度定位技术总结与展望 [4]柳景斌,赵智博,胡宁松等.室内高精度定位技术总结与展望[J].武汉大学学报(信息科学 版),2022,47(07):997-1008.DOI:10.13203/j.whugis20220029. 1.1.1 WiFi‐RTT定位 2016 年 12 月&#xff0c;随着新版 IEEE802.11 标准的公布&#xff0c…

开一家抖音小店都需要准备什么?今天一篇文章带你成功开店!

大家好&#xff0c;我是电商小布。 想要来玩抖店&#xff0c;第一件事情当然就是来开一家属于自己的抖店。 那么大家开抖店需要准备什么内容呢&#xff1f;这个是很多新手小伙伴不了解的东西。 所以呢今天&#xff0c;小布就从所需的材料和资金方面&#xff0c;来带大家详细的…

直播带货行业将迎来大地震

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 为什么这么多人喊着关闭直播带货?实体经济是到底因为什么萧条的?为什么大街上冷冷清清的?是房租、虚高的价格、还是直播带货引起的? 在4月9日的国务院政策吹风会上&#xff0c;市场监管明确指出&#xff1a; …

* ./cptable in ./node_modules/xlsx-style/dist/cpexcel.js

1) 这个报错信息就是在使用xlsx-style的时候dist中cpexcel不支持, 2) 解决方案: 在自己的前端项目中找到vue.config.js,如果没有新建一个这样的文件 在文件中编写以下内容即可: module.exports { configureWebpack: { externals: { ./cptable: var cptable } } } 3) 重新 运…

选择程序员是为什么?

本章节是关于为什么会选择一名程序员的经验分享 首先&#xff0c;我为什么会选择这个方向&#xff0c;可能是因为钱多&#xff0c;学东西不就是为了赚钱嘛&#xff1f;这是一点&#xff0c;不过最让我接收这个行业的是好奇世界的新大陆&#xff0c;可以简单的说就是&#xff0c…

ubuntu系统安装python虚拟环境

一、安装python&#xff1a; 步骤1&#xff1a;在Ubuntu系统中打开终端&#xff0c;你可以使用快捷键CtrlAltT来打开终端&#xff0c;或者在应用程序菜单中找到终端。 步骤2&#xff1a;更新软件包列表&#xff0c;在终端中输入以下命令&#xff0c;更新软件包列表&#xff1…

MobX原理剖析:基于可观察状态和自动依赖追踪的响应式状态管理

我们用代码示例来说明 MobX 的核心原理。 首先,我们定义一个简单的 Store 类,其中包含一个可观察的计数器状态: import { observable, action } from mobx;class CounterStore {observable count 0;actionincrement () > {this.count;};actiondecrement () > {this.…

Linux Shell:`alias`命令

Linux Shell&#xff1a;alias命令 alias命令是Linux和Unix系统中Shell的内置命令&#xff0c;用于创建命令的简短名称&#xff0c;即别名。这些别名通常用来缩短长命令或为常用命令序列创建便捷的缩写&#xff0c;从而提高工作效率。别名在当前Shell会话中有效&#xff0c;除…

Leetcode算法训练日记 | day20

一、合并二叉树 1.题目 Leetcode&#xff1a;第 617 题 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新…