写给大忙人看的Go语言

发布时间:2020-07-19 09:58:34 作者:BlueMiaomiao
来源:网络 阅读:3609

Tips

写给大忙人看的Golang教程(一)
阅读本文之前,我认为你已经掌握其他语言基础并写出一个简单的项目。

(1)Golang编程注意事项

(2)Golang中的常用转义字符

(3)注释方式

(4)Golang的代码规范

(5)官方编程指南

(6)变量

(7)Golang支持的数据类型

写给大忙人看的Go语言

(8)基本数据类型转换

(9)指针数据类型

package main

import "fmt"

func main() {

    var i = 10
    var ptr *int = &i

    fmt.Println("变量i的内存地址是: ", ptr)
    // 变量i的内存地址是:  0xc00004a080
    fmt.Println("变量i的存储内容是: ", *ptr)
    // 变量i的存储内容是:  10
}

(10) 值类型与引用类型

写给大忙人看的Go语言

写给大忙人看的Go语言

(11)Golang中的标识符

(12)运算符

(13)控制台输入输出

(14) 原码、反码、补码

(15)流程控制

(15.1)顺序控制

(15.2) 分支控制
(15.3)循环控制

(16) 随机数

// 设置随机数的种子为当前的系统时间
rand.Seed(time.Now().Unix())
// 生成0-99范围的随机数
randomNumber := rand.Intn(100)

(17)break、continue、goto、return语句

label:
for {
    break label
}
label:
for {
    continue label
}

(18)函数

(19)包

​ 包的本质就是一个目录,Go的每一个文件都必须属于一个包。

(20)init函数

func init() {}
// util.HelloWorld.go
package utils

import "fmt"

func init() {
    fmt.Println("Util.HelloWorld() init")
}

func HelloWorld()(){
    fmt.Println("Hello World")
}

// main.test.go
package main

import (
    "StudyGo/utils"
    "fmt"
)

func init() {
    fmt.Println("Main.main() init")
}

func main() {
    utils.HelloWorld()
}

// Util.HelloWorld() init
// Main.main() init
// Hello World

(21)匿名函数

(22)闭包

(23)defer 关键字

(24) 字符串函数

(25)时间日期函数

(26)内置函数

(27)错误处理

(28)OOP

(29)方法

func (recv type) funcName (paramsList)(returnList) {
    // something
}

通常为了执行效率一般不会直接传入结构体类型作为接收器,而是结构体类型指针:

func (dog *Dog) function()(){ // 绑定的是地址,操作时也要使用地址
    // something
}
// 调用时
var d Dog
(&d).function()

但是编译器做出了相关的优化:

var d Dog
d.function()

(30)文件

package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("main/file.txt")
    if err != nil {
        fmt.Println(err)
    }
    err = file.Close()
    if err != nil {
        fmt.Println(err)
    }
}

(31)命令行参数处理

os.Args []string保管了所有命令行参数,第一个参数是程序名称。

flag包可以实现更加高级的命令行参数处理:

var username string
// 绑定参数
flag.StringVar(&username, "u", "root", "Username")
//  -- 保存参数字符串的地址
//  -- 参数名称
//  -- 默认值
//  -- 参数释义
// 解析参数
flag.Parse() 

(32)Json文件处理

结构体、切片、Map等都可以解析为Json字符串,使用encoding/json.Marshal(i interface{},)([]byte, error)来实现各种类型到Json数据;使用encoding/json.Unmarshal(Json字符串, 实例对象的引用)反序列化。

(33)单元测试

Go语言自带轻量级的测试框架和go test -v命令来实现单元测试和性能测试。Go的测试指令会自动识别以TestXxx命名的函数:

import "testing"
func TestXxx(t *testing.T){
    t.Fatalf(string) // 停止测试并记录日志
}

(34)goroutine

Go主线程可以理解为线程也可以理解为进程,一个Go线程可以包含多个协程(微程),Go程具备以下几点特质:

主线程是一个重量级物理线程,直接作用在CPU上,非常消耗资源,协程从主线程开启,是逻辑态的轻量级线程,相对资源消耗少。在Go中可以轻松开启成千上万个协程,其他语言的并发机制一般是线程实现,这就是Go的优势。使用go关键字修饰一个函数等即可开启一个Go程。Go可以充分发挥多核多CPU的优势,使用runtime.NumCpu()可以获取当前机器的CPU个数,使用runtime.GOMAXPROCS(n int)设置可用的CPU数量。在Go1.8之前需要手动设置,Go1.8以后默认使用多CPU。

(35)管道

不同的Go协程如何实现通信,下面给出两种方法:

在Go中,sync包提供了基本的同步单元,大部分适用于低水平的程序线程,高水平的同步一般使用管道解决。

(36)反射

通过reflect.TypeOf()获取变量类型,返回reflect.Type类型

通过reflect.ValueOf()获取变量的值,返回reflect.Value类型

(37)网络编程

listen, err := net.Listen("tcp", "0.0.0.0:8888")
if err != nil{
    return
}
defer listen.Close()

for {
    connect, err := listen.Accept()
    if err == nil {
        go func (connect net,Conn)(){
            defer connect.Close()
            buffer := make([]byte, 1024)
            num, err := connect.Read(buffer)
            if err != nil {
                return
            }
        }()
    }
}
connect, err := Dial("tcp", "127.0.0.1:8888")
if err != nil {
    return
}
num, err := connect.Write([]byte("Hello"))
connect.Close()
推荐阅读:
  1. 写给使用Unity进行游戏开发的建议
  2. 写给MongoDB开发者的50条建议Tip25

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

go 基础 编程

上一篇:在windows7系统上使用ghost备份

下一篇:Reactive Stack系列(一):响应式编程从入门到放弃

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》