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

这篇具有很好参考价值的文章主要介绍了【Golang】一文学完 Golang 基本语法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Golang 下载

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

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

第一个 golang 程序

package main

import "fmt"

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

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

变量

主函数文件:

package main

import (
   "awesomeProject/package1"
   "fmt"
)

// 全局变量
var gStr string
var gInt int

func main() {
   // 局部变量
   var lStr string
   var lInt int

   gStr = "out"
   gInt = 100

   lStr = "in"
   lInt = 50

   fmt.Println(gStr)
   fmt.Println(gInt)
   fmt.Println(lStr)
   fmt.Println(lInt)
    
   // 包外函数
   package1.Fun()

   // 包外变量
   package1.Str = "good"
   fmt.Println(package1.Str)
}

package1 包的文件:

package package1

import (
   "fmt"
)

var Str string

func Fun() {
   fmt.Println("test")
}

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

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

数组,切片,字典

package main

import "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 main

import "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 取 false
   if 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 main

import "fmt"

func main() {
   for i := 0; i < 5; i++ {
      fmt.Printf("i = %d ", i)
   }
   fmt.Println("")

   j := 0
   for {
      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 main

import (
   "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]string

type stu struct{}

var ch3 chan stu
var ch4 chan *stu

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

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

package main

import (
   "fmt"
   "time"
)

var ch chan int

func a() {
   time.Sleep(3 * time.Second)
   a := 5
   ch <- a // 发送操作
   fmt.Println("out of a")
}

func b() {
   time.Sleep(1 * time.Second)
   fromA := <-ch // 接收操作
   b := fromA + 3
   fmt.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 main

import (
   "fmt"
   "time"
)

var ch chan int

func a() {
   time.Sleep(3 * time.Second)
   a := 5
   ch <- a
   fmt.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 main

import (
   "fmt"
   "time"
)

var ch chan int

func a() {
   time.Sleep(3 * time.Second)
   a := 5
   ch <- a
   fmt.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 main

import "fmt"

// Shape 是接口
type Shape interface {
   Area() float64
   Perimeter() float64
}

type Rect struct {
   height float64
   weight 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 main

import (
   "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

写在最后:

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

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

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~文章来源地址https://www.toymoban.com/news/detail-647318.html

到了这里,关于【Golang】一文学完 Golang 基本语法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 三)

    在开始之前,先明确自定义组件和页面的关系: 自定义组件: @Component 装饰的 UI 单元,可以组合多个系统组件实现 UI 的复用。 页面:即应用的 UI 页面。可以由一个或者多个自定义组件组成, @Entry 装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有

    2024年02月16日
    浏览(40)
  • HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 二)

    在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离,后续版本演进等因素。因此,将UI和部分业务逻辑封装成

    2024年02月04日
    浏览(41)
  • HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 五)

    如果每个组件的样式都需要单独设置,在开发过程中会出现大量代码在进行重复样式设置,虽然可以复制粘贴,但为了代码简洁性和后续方便维护,我们推出了可以提炼公共样式进行复用的装饰器@Styles。 @Styles装饰器可以将多条样式设置提炼成一个方法,直接在组件声明的位

    2024年02月17日
    浏览(42)
  • GoLang学习之路,对Elasticsearch的使用,一文足以(包括泛型使用思想)(二)

    书写上回,上回讲到,Elasticsearch的使用前提即:语法,表结构,使用类型结构等。要学这个必须要看前面这个:GoLang学习之路,对Elasticsearch的使用,一文足以(包括泛型使用思想)(一),因为这篇是基础!!!!!!! 必须要有一个 ElasticSearch 服务器 必须要有一个可视化

    2024年02月04日
    浏览(25)
  • 【Golang】go编程语言适合哪些项目开发?

    前言 在当今数字化时代,软件开发已成为各行各业的核心需求之一。 而选择适合的编程语言对于项目的成功开发至关重要。 本文将重点探讨Go编程语言适合哪些项目开发,以帮助读者在选择合适的编程语言时做出明智的决策。 Go 编程语言适合哪些项目开发? Go是由Google开发

    2024年02月04日
    浏览(60)
  • Golang个人web框架开发-学习流程

    github地址:ameamezhou/golang-web-frame 后续还将继续学习更新 设置免密登录 ssh-keygen 一路回车就OK 上面有告诉你密钥生成地址 红框为需要上传的公钥 首先明确目标– 我们学习开发web框架的目的是 : 在日常的web开发中,我们经常要使用到web框架, python 就有很多好用的框架,比如

    2024年01月19日
    浏览(25)
  • 【Golang】VsCode下开发Go语言的环境配置(超详细图文详解)

    📓推荐网站(不断完善中):个人博客 📌个人主页:个人主页 👉相关专栏:CSDN专栏、个人专栏 🏝立志赚钱,干活想躺,瞎分享的摸鱼工程师一枚 ​ 话说在前,Go语言的编码方式是 UTF-8 ,理论上你直接使用文本进行编辑也是可以的,当然为了提升我们的开发效率我们还是需

    2024年02月07日
    浏览(70)
  • 【GoLang】基础语法(上)

    注释主要的功能就是为了增强代码的可读性,不参与程序的一切功能 ,G0语言的注释主要分成两类: 单行注释 多行注释 写注释是一个十分良好的习惯,我们都应该按照要求给自己代码写好注释,为了自己,也为了他人。很多大公司里也是对注释有严格要求的。 搞清楚注释之

    2024年02月15日
    浏览(26)
  • Golang常用语法糖

    语法糖(Syntactic sugar)的概念是由英国计算机科学家彼得·兰丁提出的,用于表示编程语言中的某种类型的语法,这些语法不会影响功能,但使用起来却很方便。 语法糖,也称糖语法,这些语法不仅不会影响功能, 编译后的结果跟不使用语法糖也一样。 语法糖,有可能让代

    2024年02月04日
    浏览(21)
  • 细说golang语法糖

    Go语言(通常称为Golang)以其简洁性和高效性而闻名,这部分得益于其语言设计中包含的“语法糖”。语法糖(syntactic sugar)是指在编程语言中添加的某些语法特性,它们使得代码更易读和编写,而不改变程序的实际执行逻辑。以下是Go语言中的一些语法糖: 类型推断 : Go语

    2024年04月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包