【GO学习】6.21记录

73 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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}

}