go基础使用

前言

目前项目使用Go,下面谢了一些笔记,记录下go的基础使用。

变量声明

类型在变量后面

s := ""//类型推导
var s string
var s = ""
var s string=""

短变量声明

t := expression

仅用在函数内

多重赋值

var i, j int = 1, 2

for循环

while 用法

sum := 1
for sum < 1000 {
    sum += sum
}

三种格式

for initialization;condition;post{

}

字符串range 用法


defer 关键字

将函数推迟到外层函数返回之后执行
推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。

推迟的函数调用会被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。

指针

数组

声明
var a [10]int
赋值
primes := [...]int{2, 3, 5, 7, 11, 13}

utf-8编码

复合数据结构

channel

ch:=make(chan int ,10)
读 v:=<-ch
写 ch<-v

  • 长度为0的channel为不带buffer的channel
    • 读在写之前发生
    • 不发生额外数据拷贝

slice []T

避免在两个变量中修改同一个底层数组
primes := [6]int{2, 3, 5, 7, 11, 13}
var s []int = primes[1:4]

数组创建

[3]bool{true, true, false}

切片创建

[]bool{true, true, false}

make 创建切片

map

用内置函数 make 可以用来创建一个map
ages := make(map[string]int)
用map的字面量创建
ages := map[string]int {"alice":31, "charlie":34, }

delete(移除操作)

闭包

经典代码
实现斐波那契数列

package main

import "fmt"

// 返回一个“返回int的函数”
func fibonacci() func() int {
    back1, back2:= 0, 1  // 预先定义好前两个值
    return func() int{
        temp:=back1
        back1,back2=back2,(back1 + back2)
        //返回temp
        return temp;
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

结构体

type Employee struct
{
ID int
Name string
Address string
Salary float64
}
结构体初始化
初始部分变量,
e1 = Employee{Name:"4"}

方法

方法和函数的区别

在函数名字前面多了一个结构体参数

    func (Employee e) salaryAfterTax () float64{
        return e.float*0.8
    }

指针接收者

结构体和非结构体类型都可声明方法

只加结构体不会修改原值,用指针会修改原字段的值

指针与函数区别(代码示例,一目了然)
https://tour.go-zh.org/methods/5

方法与指针重定向

使用指针接收者的原因:

  • 首先,方法能够修改其接收者指向的值。

  • 其次,这样可以避免在每次调用方法时复制该值。若值的类型为大型结构体时,这样做会更加高效
    

接口

type Gun interface{Shoot()}

type Reader interface{
    Read(b []byte) (int,error)
}
  • 空接口

空接口可保存任何类型的值

    slice := make([]interface{}, 10)
    map1 := make(map[string]string)
    map2 := make(map[string]int)
    map2["TaskID"] = 1
    map1["Command"] = "ping"
    map3 := make(map[string]map[string]string) 
     map3["mapvalue"] = map1
    slice[0] = map2
    slice[1] = map1
    slice[3] = map3
    fmt.Println(slice[0])
    fmt.Println(slice[1])
    fmt.Println(slice[3])

GO 类比java的toString()方法

func (p Person) String() string {
    return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
}

并发

你可能感兴趣的:(go基础使用)