Day 03 strings 和 strconv 的使用, 时间和日期类型 流程控制 函数
Day 03
strings 和 strconv 的使用
strings.HasPrefix(str string, prefix string) bool
:判断字符串str
是否以prefix
开头strings.HasSuffix(str string, suffix string) bool
:判断字符串str
是否以suffix
结尾strings.Index(str string, substr string) int
: 判断substr
在str
中首次出现的位置,如果没有出现则返回-1
strings.LastIndex(str string, substr string) int
: 判断substr
在str
中最后出现的位置,如果没有出现则返回-1
strings.Replace(str string, old string, new string, n int) string
:将str
中的old
字符串替换成new
字符串,n
表示替换的个数,如果 $n \lt 0$ 则表示替换个数无限制。strings.Count(str string, substr string) int
:字符串计数,但是str
中出现的substr
并不叠加。例如:eee
中出现ee
的次数为1
strings.Repeat(str string, count int) string
:重复count
次str
strings.ToUpper(str string) string
:字符串转为大写strings.ToLower(str string) string
:字符串转为小写strings.TrimSpace(str string) string
:去掉str
字符串中的首尾空白字符strings.Trim(str string, cutset string)
:去掉str
字符串中首尾在cutset
中出现的字符strings.TrimLeft(str string, cutset string)
:去掉str
字符串首部在cutset
中出现的字符strings.TrimRight(str string, cutset string)
:去掉str
字符串尾部在cutset
中出现的字符strings.Fields(str string) []string
:返回str
字符串空格分割的所有子串的slice
strings.Split(str string, sep string) []string
:返回str
字符串通过sep
分割的所有子串的slice
strings.Join(a []string, sep string) string
:用sep
把a
中的所有元素连接起来strconv.Itoa(n int) string
:将整数n
转化成字符串strconv.Atoi(s string) (int, error)
:将字符串s
转化成整数
时间和日期类型
(t Time) Format(layout string) string
:时间格式化函数,通过layout
字符串对时间进行格式化。layout
字符串使用与其他语言中的不太一样。使用一个时间实例进行表示:"2006-01-02 15:04:05.000"
如:time.Now().Format("2006-01-02 15:04:05.000")
time.Now() Time
:获取当前时间。(t Time) UnixNano() int64
:获取时间对应的 Unix 时间戳,单位:纳秒。(t Time) Unix() int64
:获取时间对应的 Unix 时间戳,单位:秒。
指针类型
- 普通类型,变量存的是值,也叫值类型。
- 获取变量的地址用
&
,比如:var a int
,获取a
的地址:&a
- 指针类型,变量存的是一个地址,这个地址指向的内存存的才是值。
- 获得指针所指向的值使用
*
,比如:var *p int
,使用*p
获取p
指向的内存的值。
流程控制
-
if-else
分支 -
switch
分支,Go语言中的switch
语句不需要break
进行截断。然而可以通过fallthough
关键字使得进入case
之后执行完继续执行后续case
的语句。 -
for
语句-
for` 语句外面是没有括号的。
for i := 0; i < n; i++ { }
-
Go 语言中没有
while
语句,使用for
进行代替。for i < n { }
-
for range
语句for i, v := range("Hello") { fmt.Printf("i: %d v: %c\n", i, v) }
-
-
break
和continue
语句 -
goto
和label
语句
函数
-
函数的声明语法:
func 函数名 (参数列表) [(返回值参数列表)] {}
func add() { }
func add(a int, b int) { }
func add(a int, b int) int { }
func add(a int, b int) (int, int) { }
func add(a, b int) (int, int) { }
注意:花括号的左括号必须跟在函数声明行末
-
Go 函数的特点:
- 不支持重载,一个包不允许有两个名字一样的函数。
- 函数是一等公民,函数也是一种类型,一个函数可以赋值给变量。
- 匿名函数
- 多返回值
-
函数参数的传递方式
- 值传递
- 引用传递
注意1: 无论是值传递还是引用传递,传递给函数的都是变量副本,不过,值传递是值的拷贝,引用传递是地址的拷贝。一般来说,地址拷贝更为高效,而值拷贝取决于拷贝对象的大小。对象越大,则值拷贝的效率越低。
注意2:
map
、slice
、chan
、指针 、interface
默认以引用的方式传递。 -
命名返回值名称:
func add (a int, b int) (sum int, avg int) { sum = a + b avg = sum / 2 return sum, avg }
-
_
标识符,用来忽略返回值。 -
可变参数:
func sum(arg...int) int { ans := 0 for _, val := range arg { ans += val } return ans }
func max(a int, arg...int) int { maxVal := a for _, item := range arg { if item > maxVal { maxVal = item } } return maxVal }
-
defer
的用途- 当函数返回时,执行
defer
语句。因此可以用来做资源清理。 - 多个
defer
语句,按先进后出的方式执行。 defer
语句中的变量,在defer
声明时就决定了。
用途:
- 关闭文件句柄
- 锁资源释放
- 数据库连接释放
- 当函数返回时,执行
写入自己的博客中才能记得长久