[TOC]
>[success] ## **1:基本介绍**
1)函数内部声明/定义的变量叫局部变量,作用域仅限于函数内部。
2)函数外部声明/定义的变量叫全局变量,作用域在整个包都有效,如果其首字母为大写,则作用域在整个程序有效。

3)如果变量是在一个代码块,比如for/if中, 那么这个变量的的作用域就在该代码块
<br>
<br>
>[success] ## **练习题**
如下代码,会报错

<br>
<br>
>[success] ## **函数的练习**
1)在终端输入一个整数,打印出相应的金字塔

2)打印99惩罚表

## **2 string常用的函数**
说明:字符串在我们程序开发中,使用的是非常多的,常用的函数需要掌握[带看手册或者官方编程指南]:
1)**统计字符串的长度**, 按字节len(str)-----(len是按照字节遍历,并非按照字符)

2)**字符串遍历** 同时处理有中文的问题r:= **[ ]rune(str)**;例如遍历 a:=“hallo北京”

3)**字符串转整数**: n, err := strconv.Atoi("12")

4)**整数转字符串** str = strconv.Itoa(12345)

5)字符 串转`[]byte: var bytes = []byte("hello go")`

6)[ ]byte 转字符串: `str = string([ ]byte{97, 98, 99})`

7)10进制转2, 8, 16进制: str = strconv.FormatInt(123, 2)//2->8,16
[strconv](https://studygolang.com/static/pkgdoc/pkg/strconv.htm)**:包**
func [FormatInt](#18 "View Source")
func FormatInt( i [int64](#int64), base [int](#int)) [string](#string)
返回i的base进制的字符串表示。base 必须在2到36之间,结果中会使用小写字母'a'到'z'表示大于10的数字。

8)查找子串是否在指定的字符串中: strings.Contains("seafood", "foo") //true
[strings](https://studygolang.com/static/pkgdoc/pkg/strings.htm)**:包**
func [Contains](#112 "View Source")
func Contains(s, substr [string](#string)) [bool](#bool)
判断字符串s是否包含子串substr。

9)统计一个字符串有几个指定的子串: strings.Count("ceheese", "e") //4
func [Count](#65 "View Source")
func Count(s, sep [string](#string)) [int](#int)
返回字符串s中有几个不重复的sep子串。

10)不区分大小写的字符串比较(==是区分字母大小写的):
func [EqualFold](#674 "View Source")
func EqualFold(s, t [string](#string)) [bool](#bool)
判断两个utf-8编码字符串(将unicode大写、小写、标题三种格式字符视为相同)是否相同。

11)返回子串在字符串第一次出现的index值,如果没有返回-1 :strings.Index("NLT_ abc", "abc")//4
func [Index](#127 "View Source")
func Index(s, sep [string](#string)) [int](#int)
子串sep在字符串s中第一次出现的位置,不存在则返回-1。

12)返回子串在字符串最后一次出现的index, 如没有返回-1 : strings LastIndex("go golang". "go")(**求字符串最后出现的位置是第几个**)
func [LastIndex](#164 "View Source")
func LastIndex(s, sep [string](#string)) [int](#int)
子串sep在字符串s中最后一次出现的位置,不存在则返回-1。

13)将指定的子串替换成另外一个子串:
strings Replace("go go hello", "go", "go 语言", n)n可以指定你希望替换几个,如果n=-1表示全部替换
func [Replace](#638 "View Source")
func Replace(s, old, new [string](#string), n [int](#int)) [string](#string)
返回将s中前n个不重叠old子串都替换为new的新字符串,如果n<0会替换所有old子串。

14)按照指定的某个字符,为分割标识,将一个字符串拆分成字符串数组:strings.Split("hello,wrold,ok". "")
func [Split](#294 "View Source")
func Split(s, sep [string](#string)) [ ][string](#string)
用去掉s中出现的sep的方式进行分割,会分割到结尾,并返回生成的所有片段组成的切片(每一个sep都会进行一次切割,即使两个sep相邻,也会进行两次切割)。如果sep为空字符,Split会将s切分成每一个unicode码值一个字符串。

15)将字符串的字母进行大小写的转换: strings ToLower("Go") // go strings.ToUppr("Go") // GO

16)将字符串左右两边的空格去掉: strings.TrimSpace(" tn a lone gopher ntm ")
func [TrimSpace](#613 "View Source")
func TrimSpace(s [string](#string)) [string](#string)
返回将s前后端所有空白(unicode.IsSpace指定)都去掉的字符串。

17)将字符串左右两边指定的字符去掉: strings.Trim("! hello!", " !") // ["hello"] /将左右两边!
和”"去掉
func [Trim](#586 "View Source")
func Trim(s [string](#string), cutset [string](#string)) [string](#string)
返回将s前后端所有cutset包含的utf-8码值都去掉的字符串。

18)将字符串左边指定的字符去掉: strings.TimLeft("! hello!", "!") // ["hello"]//将左边!和"
"去掉
func [TrimLeft](#595 "View Source")
func TrimLeft(s [string](#string), cutset [string](#string)) [string](#string)
返回将s前端所有cutset包含的utf-8码值都去掉的字符串。
<br>
<br>
19)将字符串右边指定的字符去掉: strings.TrimRight("! hello!", "!") // [hello"]将右边! 和"
"去掉
func [TrimRight](#604 "View Source")
func TrimRight(s [string](#string), cutset [string](#string)) [string](#string)
返回将s后端所有cutset包含的utf-8码值都去掉的字符串。
<br>
<br>
20)判断字符串是否以指定的字符串开头: stings .HasPrefix(" fp://192168.10.1". "ftp") //true
func [HasPrefix](#371 "View Source")
func HasPrefix(s, prefix [string](#string)) [bool](#bool)
判断s是否有前缀字符串prefix。

<br>
<br>
21)判断字符串是否以指定的字符串结束: strings HasSuffix("NLT_ abc.jpg"; "abc") /false
func [HasSuffix](#376 "View Source")
func HasSuffix(s, suffix [string](#string)) [bool](#bool)
判断s是否有后缀字符串suffix。

- Golang语言之旅
- 第一章:初始小节以及安装
- 一:Golang语言特性
- 二:Windows上安装Go语言开发包
- 三:在Mac OS上安装Go语言开发包
- 第二章:GO语言注意事项
- 一:Dos的常用指令
- 第三章:Go初识小菜
- 一:Go语言之变量与常量
- 二:Go内置值-引用类型
- 三:基本的数据类型
- 四:字符串(char)
- 五:布尔类型(bool)
- 六:字符串类型(string)
- 七:基本数据类型的默认值
- 八:基本数据类型的互相转换
- 九:基本数据类型和string类型的相互转换
- 十:Golang指针
- 十一:值类型和引用类型
- 十二:标识符和命名规范
- 十三:系统保留关键字and预定义标识符
- 十四:fmt常用方法解析
- 第四章:Go运算符
- 一:运算符的基本介绍
- 二:算术运算符
- 2.1:算数运算符细节
- 三:关系运算符
- 3.1:关系运算符细节
- 四:逻辑运算符
- 4.1:逻辑运算符细节及案例
- 五:Go赋值运算符
- 5.1:案例演示赋值运算符的基本使用
- 5.2:赋值运算符的特点
- 六:Go位运算符
- 七:其他运算符
- 八:运算符的优先级
- 九:控制台输入语句
- 十:进制
- 十一:位运算
- 第五章:流程控制大纲
- 一:if语句
- 二:switch语句
- 三:for循环
- 第六章:函数-包-错误处理
- 一:Go函数
- 二:Go包
- 三:匿名函数
- 四:闭包
- 五:函数defer
- 六:函数参数的传递方式
- 七:变量的作用域
- 八:时间和日期相关函数
- 九:new和recover异常
- 十:数组(Array)切片(Section)
- 十一:切片(slice)
- 十二:3 数组的排序和查找
- 第七章:Map
- 第一节:Map基础认识
- 第二节:Map初始化和make
- 第三节:Map增删改查
- 第四节:Map的切片
- 第五节:Map的注意事项
- 第八章:面向对象(上)
- 第一节:结构体(值类型)
- 第二节:方法
- 第三节:面向对象编程应用实例
- 第九章:面向对象(下)
- 第一节:面向对象之抽象
- 第二节:面向对象之继承
- 第三节:面向对象之多态
- 第四节:接口
- 第十章:文件操作
- 第一节:文件基本介绍
- 第二季:写文件实例操作
- 第三节:JSON
- 第十一章:单元测试
- 第一节:单元测试介绍
- 第二节:单元测试案例
- 第三节:单元测试总结
- 第四节:单元测试案例
- 第十二章:goroutine和channel
- 第一节:goroutine基本介绍
- 第二节:goroutine入门案例
- 第三节:goroutione调度模型
- 第四节:Golang设置运行的CPU数量
- 第十二章:channel
- 第一节:channel基本介绍
- 第二节:channel基本使用
- 第三节:channel案例演示
- 第四节:channel 使用的注意事项
- 第五节:channel练习题
- 第六节:channel的遍历和关闭
- 第七节:goroutione和channel结合
- 第八节:channel细节处理
- 第十二章:并发模式
- 第十三章:反射reflect
- 第一节:反射基本介绍
- 第二节:反射重要的函数和概念
- 第三节:反射快速入门案例
- 第四节:反射注意事项
- 第五节:反射练习题
- 第六节:反射最佳实践