【Golang】一文学完 Golang 基本语法

Golang 下载

安装包链接:https://share.weiyun.com/InsZoHHu

IDE 下载:https://www.jetbrains.com/go/

第一个 golang 程序

package mainimport "fmt"func main() {fmt.Println("hello golang")
}

每个可执行代码都必须包含 Package、import 以及 function 这三个要素。

变量

主函数文件:

package mainimport ("awesomeProject/package1""fmt"
)// 全局变量
var gStr string
var gInt intfunc main() {// 局部变量var lStr stringvar lInt intgStr = "out"gInt = 100lStr = "in"lInt = 50fmt.Println(gStr)fmt.Println(gInt)fmt.Println(lStr)fmt.Println(lInt)// 包外函数package1.Fun()// 包外变量package1.Str = "good"fmt.Println(package1.Str)
}

package1 包的文件:

package package1import ("fmt"
)var Str stringfunc Fun() {fmt.Println("test")
}

注意:golang是以首字母大小写来区分对包外是否可见。

所以 Fun() 函数,Str,想要在 main 文件被访问,都首字母大写了。

数组,切片,字典

package mainimport "fmt"func main() {//数组初始化var strAry = [10]string{"aa", "bb", "cc", "dd", "ee"}//切片初始化var sliceAry = make([]string, 0)sliceAry = strAry[1:3]//字典初始化var dic = map[string]int{"apple":      1,"watermelon": 2,}// %v 是按照默认格式输出fmt.Printf("strAry %+v\n", strAry)fmt.Printf("sliceAry %+v\n", sliceAry)fmt.Printf("dic %+v\n", dic)
}

切片通过索引的方式指向了数组。切片是可以更改某个元素内容的,数组则不能,在开发中,主要都是使用切片来进行逻辑处理。

条件判断语句

package mainimport "fmt"func main() {// 可以通过 := 这种方式直接初始化基础变量localStr := "case3"if localStr == "case3" {fmt.Printf("into ture logic\n")} else {fmt.Printf("into false logic\n")}//字典初始化var dic = map[string]int{"apple":      1,"watermelon": 2,}// 用于检查字典中某个键是否存在,如果存在 num 取键值,ok 取 true,反之 ok 取 falseif num, ok := dic["orange"]; ok {fmt.Printf("orange num %d\n", num)}if num, ok := dic["watermelon"]; ok {fmt.Printf("watermelon num %d\n", num)}switch localStr {case "case1":fmt.Println("case1")case "case2":fmt.Println("case2")case "case3":fmt.Println("case3")default:fmt.Println("default")}
}

循环

package mainimport "fmt"func main() {for i := 0; i < 5; i++ {fmt.Printf("i = %d ", i)}fmt.Println("")j := 0for {if j == 5 {break}fmt.Printf("j = %d ", j)j++}fmt.Println("")// 可以指定初始个数也var strAry = []string{"aa", "bb", "cc", "dd", "ee"}//切片初始化var sliceAry = make([]string, 0)sliceAry = strAry[1:3]for i, str := range sliceAry {fmt.Printf("slice i %d, str %s ", i, str)}fmt.Println("")//字典初始化var dic = map[string]int{"apple":      1,"watermelon": 2,}for k, v := range dic {fmt.Printf("key %s, value %d\n", k, v)}
}

range 关键字用于迭代切片、数组、字典等可迭代的数据结构。

协程

package mainimport ("fmt""time"
)func a() {time.Sleep(3 * time.Second)fmt.Println("it's a")
}func b() {time.Sleep(2 * time.Second)fmt.Println("it's b")
}func c() {time.Sleep(1 * time.Second)fmt.Println("it's c")
}func main() {go a()go b()go c()time.Sleep(5 * time.Second)
}

只要使用关键字 go 就能让 a,b,c 三个函数并发运行。

通道(channel)

通道的要点:

1.类似 Linux 中管道(pipe),先进先出; 2.线程安全,多个 goroutine 同时访问,不需要加锁; 3.channel 是有类型的,一个整数的 channel 只能存放整数。

通道的定义:

var ch0 chan int
var ch1 chan string
var ch2 chan map[string]stringtype stu struct{}var ch3 chan stu
var ch4 chan *stu

通道可以用于协程之间数据的传递,一般分为有缓冲通道无缓冲通道

两个协程间如果有数据交流,这时候就可以用通道来传递。

package mainimport ("fmt""time"
)var ch chan intfunc a() {time.Sleep(3 * time.Second)a := 5ch <- a // 发送操作fmt.Println("out of a")
}func b() {time.Sleep(1 * time.Second)fromA := <-ch // 接收操作b := fromA + 3fmt.Println("b is ", b)
}func main() {ch = make(chan int, 1)go a()go b()time.Sleep(20 * time.Second)fmt.Println("out of main")
}
  1. make(chan int, 1) 用于创建一个新的信道,其中 chan int 表示该信道用于传输整数类型的值。
  2. 逗号后的 1 是指定信道的缓冲大小。缓冲大小表示信道可以同时容纳的元素个数。 在这种情况下,ch 是一个缓冲大小为 1 的信道,即最多可以同时容纳一个整数值。

举个例子:

创建缓冲信道时,当发送操作(ch <- value)发生时,如果缓冲区已满,发送操作将被阻塞,直到有接收操作(value = <-ch)从缓冲区中读取值。类似地,当接收操作(value = <-ch)发生时,如果缓冲区为空,接收操作将被阻塞,直到有发送操作(ch <- value)将值放入缓冲区。

chSync := make(chan int)    // 无缓冲
chAsyn := make(chan int, 1) // 有缓冲

理解有缓冲和无缓冲:

同样是向通道里塞一个数据:chSync <-1 无缓冲场景:一直要等有别的协程通过<-chSync接手了这个参数,那么chSync<-1才会继续下去,要不然就一直阻塞着。 有缓冲场景:chAsyn<-1则不会阻塞,因为缓冲大小是1,只有当放第二个值的时候,第一个还没被人拿走,这时候才会阻塞。 仔细理解下,实际这就是同步和异步的区别,无缓冲一定是同步等待,有缓冲只有在缓冲满了,异步又处理不过来的时候,才会阻塞。

举个例子:

无缓冲

package mainimport ("fmt""time"
)var ch chan intfunc a() {time.Sleep(3 * time.Second)a := 5ch <- afmt.Println("out of a")
}func b() {time.Sleep(1 * time.Second)
}func main() {ch = make(chan int) // 无缓冲管道go a()go b()time.Sleep(20 * time.Second)fmt.Println("out of main")
}

输出:

out of main

有缓冲:

package mainimport ("fmt""time"
)var ch chan intfunc a() {time.Sleep(3 * time.Second)a := 5ch <- afmt.Println("out of a")
}func b() {time.Sleep(1 * time.Second)
}func main() {ch = make(chan int, 1) // 有缓冲管道go a()go b()time.Sleep(20 * time.Second)fmt.Println("out of main")
}

输出:

out of a
out of main

接口

package mainimport "fmt"// Shape 是接口
type Shape interface {Area() float64Perimeter() float64
}type Rect struct {height float64weight float64
}func (p *Rect) Area() float64 {return p.height * p.weight
}func (p *Rect) Perimeter() float64 {return 2 * (p.height + p.weight)
}func main() {var s Shape = &Rect{height: 10, weight: 8}fmt.Println(s.Area())fmt.Println(s.Perimeter())
}

代码中Shape就是一个接口,声明了两个方法:面积(Area)和周长(Perimeter)。 咱们定义了一个具体结构 Rect,实现这个接口。可以看到,用基础的 Shape 接口,可以一个指向 Rect 对象,并调用其方法。

Golang 只需要实现某个 interface 的全部方法,那么就是实现了该类型。所以,Golang的继承关系是非侵入式的,这也是Golang的特色与优点。

webserver

用 http 裸写:

package mainimport ("log""net/http"
)func SayHello(w http.ResponseWriter, r *http.Request) {w.Write([]byte("hello")) // 以字符串"hello"作为返回包
}func main() {http.HandleFunc("/say_hello", SayHello)err := http.ListenAndServe(":8080", nil) // 开启一个http服务if err != nil {log.Print("ListenAndServe: ", err)return}
}

运行,然后就能访问了:http://localhost:8080/say_hello

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个赞哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/35100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter 状态管理 Provider

状态管理必要性 Flutter基于声明式构建UI&#xff0c;原生则是命令式&#xff0c;状态管理是用于解决声明式开发带来的问题。 例&#xff1a;命令式的原生&#xff0c;数据更新需要拿到对应控件并更改其显示值&#xff1b;而声明式则需要更改数据值并通过setstate更新状态&am…

sql高频面试题-连续完成两个指定动作的用户统计

用户行为分析 业务背景 某购物APP最近上线了一个新功能&#xff0c;用户签到后可以跳转到大转盘抽奖&#xff0c;抽奖获得的奖金可以抵消购物的费用&#xff0c;以此来培养用户使用app的习惯。 数据表介绍 现有一张用户行为表action_log&#xff0c;主要字段如下&#xff0c…

springboot mongodb 配置多数据源

我想要的效果是&#xff0c;一个类统一管理多数据源&#xff0c;我传个参数进去&#xff0c;它就能返回我对应的mongotemplate 但是根据"mongbodb 多数据源"的关键词&#xff0c;找不到我想要的效果。 网上大多都是明确知道自己是几个数据源&#xff0c;然后每个数…

Styletron: 面向组件的样式设计工具包

styletron官网&#xff1a; styletron的GitHub链接&#xff1a; styletron-react 一. 介绍 Styletron是一个通用的component-oriented&#xff08;面向组件的&#xff09;样式工具。它属于css-in-js类别。Styletron可以很好地与React配合使用&#xff0c;但也可以与其他框架或…

docker复现nginx错误配置漏洞

目录 一、nginx环境搭建 1.1搭建步骤 二、docker复现Nginx配置漏洞 2.1安装docker 2.2复现过程 2.1CRLF(carriage return/line feed)注入漏洞 2.2.目录穿越 一、nginx环境搭建 1.1搭建步骤 1.先创建Nginx的目录并进入&#xff08;命令如下&#xff09; mkdir /soft &&…

Android Framework底层原理之WMS的启动流程

一 概述 今天&#xff0c;我们介绍 WindowManagerService&#xff08;后续简称 WMS&#xff09;的启动流程&#xff0c;WMS 是 Android 系统中&#xff0c;负责窗口显示的的服务。在 Android 中它也起着承上启下的作用。 如下图&#xff0c;就是《深入理解 Android》书籍中的…

033_小驰私房菜_Qcom平台8系列-Dump Jpeg Jpeg Exif信息修改

全网最具价值的Android Camera开发系列资料~ 作者:8年Android Camera开发,从Camera app一直做到Hal和驱动~ 欢迎订阅,相信能扩展你的知识面,提升个人能力~ 平台:高通8系列 jpeg相关代码逻辑在camx/src/swl/jpeg/ 路径下 一、Dump Jpeg 有时我们想把hal这边拍照的jpe…

【C++】STL初识

1.STL的基本概念 2.vector存放内置数据类型 #include <iostream> using namespace std; #include <vector> #include <algorithm>void MyPrint(int val) {cout << val << endl; }void test01() {//创建vector容器对象&#xff0c;并且通过模板参…

Harbor企业镜像仓库部署(本地)

简述&#xff1a; Docker 官方镜像仓库是用于管理公共镜像的地方&#xff0c;大家可以在上面找到想要的镜像&#xff0c;也可以把自己的镜像推送上去。但是有时候服务器无法访问互联网&#xff0c;或者不希望将自己的镜像放到互联网上&#xff0c;那么就需要用到 Docker Regis…

越南的区块链和NFT市场调研

越南的区块链和NFT市场调研 基本介绍 https://zh.wikipedia.org/wiki/%E8%B6%8A%E5%8D%97 语言文字&#xff1a; 越南语&#xff0c; 文字以国语字&#xff08;越南罗马字&#xff09;为主&#xff0c;汉喃文&#xff08;汉字&#xff09; 货币&#xff1a;越南盾 人口(2022…

Leetcode-每日一题【剑指 Offer 15. 二进制中1的个数】

题目 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为 汉明重量).&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&…

如何安全地移动WSL 2 到另一个驱动器

当您拥有小型 SSD 并且适用于 Linux 的 Windows 子系统 (WSL) 的大小呈指数增长时&#xff0c;这真的很痛苦。没有简单的方法将 WSL 安装移动到另一个驱动器。在这篇博客中&#xff0c;我将讨论如何通过小步解决这个问题。 1.打开具有管理员访问权限的 PowerShell或命令提示符…

【Docker】Windows下docker环境搭建及解决使用非官方终端时的连接问题

目录 背景 Windows Docker 安装 安装docker toolbox cmder 解决cmder 连接失败问题 资料获取方法 背景 时常有容器方面的需求&#xff0c;经常构建调试导致测试环境有些混乱&#xff0c;所以想在本地构建一套环境&#xff0c;镜像调试稳定后再放到测试环境中。 Windows …

多线程与高并发--------线程池

线程池 一、什么是线程池 在开发中&#xff0c;为了提升效率的操作&#xff0c;我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务&#xff0c;可以将任务分成几块&#xff0c;分别交给几个线程去执行&#xff0c;最终做一个汇总就可以了。 比如做业务操…

Windows电脑快速搭建FTP服务教程

FTP介绍 FTP&#xff08;File Transfer Protocol&#xff09;是一种用于在计算机网络上进行文件传输的标准协议。它提供了一种可靠的、基于客户端-服务器模型的方式来将文件从一个主机传输到另一个主机。在本文中&#xff0c;我将详细介绍FTP的工作原理、数据传输模式以及常见…

数据结构【第4章】——栈与队列

队列是只允许在一端进行插入操作、而在另-端进行删除操作的线性表。 栈 栈与队列&#xff1a;栈是限定仅在表尾进行插入和删除操作的线性表。 我们把允许插入和删除的一端称为栈顶&#xff08;top&#xff09;&#xff0c;另一端称为栈底&#xff08;bottom&#xff09;&…

VBA技术资料MF42:VBA_从Excel中上面的单元格复制公式

【分享成果&#xff0c;随喜正能量】唯有梦想才配让你不安&#xff0c;唯有行动才能解除你的不安.绳锯木断&#xff0c;水滴石穿。也许你现在做的事情很小&#xff0c;只要你能日积月累的坚持下去&#xff0c;才会发现意义非凡。所谓的成功&#xff0c;便是别人失败的时候你还在…

微服务与Nacos概述-2

微服务间消息传递 微服务是一种软件开发架构&#xff0c;它将一个大型应用程序拆分为一系列小型、独立的服务。每个服务都可以独立开发、部署和扩展&#xff0c;并通过轻量级的通信机制进行交互。 应用开发 common模块中包含服务提供者和服务消费者共享的内容 provider模块是…

10-1_Qt 5.9 C++开发指南_Data Visualization实现数据三维显示

Data Visualization 是 Qt 提供的用于数据三维显示的模块。在 Qt 5.7 以前只有商业版才有此模块&#xff0c;而从Qt5.7 开始此模块在社区版本里也可以免费使用了。Data Visualization 用于数据的三维显示&#xff0c;包括三维柱状图、三维空间散点、三维曲面等。Data Visualiza…

鉴源实验室丨汽车网络安全攻击实例解析(二)

作者 | 田铮 上海控安可信软件创新研究院项目经理 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 引言&#xff1a;汽车信息安全事件频发使得汽车行业安全态势愈发紧张。这些汽车网络安全攻击事件&#xff0c;轻则给企业产品发布及产品…