持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情 本文的主要内容是结构体 错误处理 字符串的常用操作及格式化
结构体
1.格式:
type 结构体名 struct{
成员1 成员类型
成员2 成员类型
成员3 成员类型
……
}
例如:
type books struct {
title string
author string
subject string
book_id int
}
2.声明
变量名 :=结构体名{value1,value2,……}
或者
变量名:=结构体名{key1:value1,key2:value2……}
3.访问结构体成员:
结构体变量名.成员名
4.结构体作为函数变量
和其他变量一样 并通过上述方式访问
5.结构体指针
和其他指针类似 用指针形式可以避免一些大结构体拷贝的开销
GO错误处理
接口
通用格式:
type 接口名 interface {
函数名(参数列表) (返回值列表)
} 如:
type error interface{
Err() string
}
接口作用:限制进入函数的参数范围 符合约束的参数才进行函数运算
Golang的对于错误的处理: 需要用到err接口 在import里需要加入errors包
用一个单独的返回值err来处理错误信息 err为nil表示没有错误 否则为有错 能够清晰知道哪个函数出现了错误并能用if else处理错误
若出现错误 返回nil和错误 (错误用errors.New()创建,括号内为具体的错误)
若未出现错误 返回原本的值和nil
package main
import (
"errors" //加入errors包
"fmt"
)
type user struct {
name string
password string
}
func finduser(users []user, name string) (v *user, err error) {
for _, u := range users {
if u.name == name {//能找到
return &u, nil
}
}
return nil, errors.New("not found")//遍历之后不能找到
}
func main() {
u, err := finduser([]user{{"wang", "1024"}}, "wang")
if err != nil {
fmt.Println(err) //有错打印错误:not found
return
}
fmt.Println(u.password) //无错正常打印
if u, err := finduser([]user{{"wang", "1024"}}, "li"); err != nil {
fmt.Println(err)
return
} else {
fmt.Println(u.name)
}
在调用返回错误的函数时,接收需要两个变量 第二个为err先通过err的值判断是否有错 再进行下一步操作
字符串
1)常用操作
a := "hello"
fmt.Println(strings.Contains(a, "ll")) //查看“ll"子串是否包含在字符串a中
fmt.Println(strings.Count(a, "l"))
fmt.Println(strings.HasPrefix(a, "he"))
fmt.Println(strings.HasSuffix(a, "llo"))
fmt.Println(strings.Index(a, "ll"))
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) //把字符串拼接起来
fmt.Println(strings.Repeat(a, 2)) //重复2次
fmt.Println("ba" + strings.Repeat("na", 2)) //banana
fmt.Println(strings.Replace(a, "e", "E", -1))
fmt.Println(strings.Split("a-b-c", "-")) //切分字符串成切片
fmt.Println(strings.ToLower(a)) //全小写
fmt.Println(strings.ToUpper(a)) //全大写
fmt.Println(len(a))
b := "你好"
fmt.Println(len(b))
详细介绍:
Contains查看是否包含某一子串 包含返回true 不包含返回false
格式:func Contains(s,substr a) bool//s,a均为字符串 判s是否包含a
Join字符串链接 把切片中的内容通过sep子串连接起来
格式:func Join(a[ ]string,sep string) string
Index在字符串中查找子串在字符串中的位置,返回子串首个字母的下标值,若找不到返回-1
格式:func Index(s,sep string) int
Repeat 重复s字符串count次,最后返回重复的之后的字符串
格式:func Repeat(s string count int) string
Replace 在s字符串中,把old字符串替换为new字符串,n表示替换的次数,n<0表示把s字符串中的old字符全部替换
格式:func Replace(s, old, new string, n int) string
Split 把s字符串按照sep分割,返回切片
格式:func Split (s, sep string) [ ]string
ToLower 把字符串全变为小写
func ToLower(s string) string
ToUpper把字符串全变成大写
func ToUpper(s string) string
Trim 在s的头部和尾部去除cutset指定的字符串
格式:func Trim(s tring, cutset string) string
Fields 去除s字符串的空格符 并按照空格的分割返回切片
格式:func Fields(s string) [ ]string
GO采用UTF-8编码:
UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节
2)字符串的格式化:
type point struct {
x, y int
}
func main() {
s := "hello"
n := 123
p := point{1, 2}
fmt.Println(s, n) //hello 123
fmt.Println(p) //{1 2}
fmt.Printf("s=%v\n", s) //s=hello
fmt.Printf("n=%v\n", n) //n=123
fmt.Printf("p=%v\n", p) //p={1,2}
fmt.Printf("p=%+v\n", p) //p={x:1,y:2}
fmt.Printf("s=%#v\n", p) //s=main.point{x:1,y:2}
}