Go语言上手基础语法 |青训营笔记

114 阅读5分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

Go语言上手基础语法

9feaee36gw1esr1m93m7lg20ub0tyhae.gif

变量与常量

Go是一门强类型语言,每一个变量都有自己的类型 Go的变量通过var来定义 常量则通过const声明 命名原则一般用驼峰命名法 声明方式

const num = 1000
var a = "hello"
var a,b int = 1,2   //在变量名后面加类型
f :=float32(4.00)  //用:=声明  类型要包裹值

ifelse语句

Go中if else语句与C++,js不同,条件语句不需要加括号但是结尾需要马上加上花括号{},else要紧接在if语句结束之后 不能换行

for循环

Go中没有whlie和do-while循环 只有for循环; 使用方式和C++类似 但也是在循环语句后必须加上{}

switch

switch option{
    case 1//
    case option://
    default:
        //
}

数组

var name [len] type 
name := [len] tyoe {数组内容} 
//定义数组语句
//数组中没有赋值的索引会被模式设为0
//二维数组
var name [l_len][r_Len] type //定义二维数组
//遍历数组用for循环语句实现

切片

切片不同于数组 其长度是可变的 切片通过make来创建 可以向数组一样使用 还有取出操作 类似于js的数组切片方法

s := make([]type.len)

通过append(name,value)添加 在末尾插入 如果容量不够可以自动发送扩容并返回一个新的切片

s = append(s,"a")

用copy()来把一个切片拷贝到另外一个切片

c := make([]string,len(s))
copy(c,s) //第一个参数是为目标,第二个参数为拷贝对象

map

键对 一个键对应一个值 (完全无序)

//声明方法
m := make(map[string]int) //map(键的类型) +键值的类型
m :=map[string](int){}
//添加kv对
m["key"] = value
//删除键对 用delete关键字
delete[key]  
//判断键值是否存在 1.定义两个变量对应一个map的键  
//2.如果键存在 返回键值给第一个参数 返回bool值true给第一个参数
//  否则返回一个空值给第一个参数 返回flase给第二个参数
r,ok := map[key]

range

range可用于遍历数组和map

for i,num := range arr/map {} //如果不需要索引的话 可以用下划线_忽略

  • 第一个值返回数组的索引或map的键 第二个值返回对应数组的值或键值

func函数

在go语言中 函数的定义需要在函数名前加关键字func 它的位置放在main()函数之上 返回值类型或名称都放在函数后面 一般函数都回两个值,一个是需要的返回值,一个是错误类型;

func add(a int, b int) int{}//返回值类型

指针

指针的常用用途就是对常用的参数进行修改

func add1 (n int){
    n += 2   //只是对传入的参数进行拷贝 并没有发生实质性的修改
}
func add2 (n *int){
    *n += 2  //n发生了改变 
}
func main(){
     n:=5
     fmt.println(add1(n))
     fmt.printlb(&n) //在调用时须在前面加上& 才能实现类型的匹配
}

结构体

带类型字段的集合 没有初始话的结构体就会是空值 定义方法:

type name struct{
    name  type
    value type
}
name.value = xxx  //通过.来读取或写入  类似于C++

结构体也能作为函数的参数 有指针和非指针两种用法:使用指针可以修改函数的值 在大型结构体的拷贝中可以有效减少开销

结构体方法

结构体方法即类成员函数,可直接由.字段名字调用 操作便携

  • 定义方法: func (u user)函数名() 返回类型 //在定义时 一定要在func后面紧接结构体类型才能实现

错误处理

go语言的错误处理通常用range来实现 自带error包;用range遍历返回第二个参数为错误类型

引用文章:Go错误处理

func findUser(users []user, name string) (v *user, err error) {
   for _, u := range users {
      if u.username == name {
         return &u, nil     //如果存在则返回数值和空
      }
   }
   return nil, errors.New("not found")  //如果不存在则返回nil 和抛出空错误
}

我们还需要在main函数中做一些处理返回 如果错误不为空 则返回函数 否则运行时可能会发生错误
//eg:
if err != nil {
   fmt.Println(err)
   return
}

字符串操作

标准库string里面有很多操作函数 一些例子如下:

a := "hello"
fmt.Println(strings.Contains(a, "ll"))           //true   //判断字符串是否包含字段 如果包含则返回true
fmt.Println(strings.Count(a, "h"))              //1    //字符串计数
fmt.Println(strings.HasSuffix(a, "he"))          // true  //
fmt.Println(strings.Index(a, "he"))              //0   //返回字符串的位置
fmt.Println(strings.Join([]string{"he", "w"}, "-"))     //he-w //join同过sep拼接字符串
fmt.Println(strings.Replace(a, "e", "E", 1))    //hEl lo  //替换特定位置的字符串
fmt.Println(strings.Split("a-b-v","-"))    //以sep拆分字符串并返回一个新的数值[a b c]

字符串格式化

  • Print:输出到控制台(不接受任何格式化,它等价于对每一个操作数都应用 %v)

  • Println:输出到控制台并换行

  • Printf:只可以打印出格式化的字符串。只可以直接输出字符串类型的变量(不可以输出整形变量和整形 等)

  • Sprintf:格式化并返回一个字符串而不带任何输出

  • Fprintf:来格式化并输出到 io.Writers 而不是 os.Stdout

对于结构体

  • %v 按照每种数据类型的默认占位符格式化
  • %+v 添加字段名(如结构体)
  • %#v  相应值的Go语法表示
  • %T 相应值的类型的Go语法表示
  • %% 字面上的百分号,并非值的占位符
  • %.f 打印浮点数 点后面为保留位数

JSON处理(important)

  • 对于已有的结构体 只需保证每个字段的首字母是大写的即可
  • 只要保证上述条件的结构体就能用json.Marshal()示例化
  • Json.Marshal会返回一个buf数串 使用string(buf)可强制转换为字符串 否则会打印出一些16进制的编码
  • panic()处理error的手段
  • json.Unmarshat(Json,&target) //反示例化到并传递给target 此处的b前一定要加& 把Json传入并改变参数值而不是简单的拷贝一下

Gojson.PNG

time

通过time包对时间处理

now := time.now()获取当前时间

进程处理

  • os.Args //获取进程在执行时的一些命令行参数
  • os.Getenv //获取环境变量
  • os.Setenv //写入环境变量
  • exec.Command().CombinedOutput() //获取子进程输入输出