首页 > 其他分享 >go语言:没有class

go语言:没有class

时间:2023-07-08 17:12:33浏览次数:41  
标签:语言 int fmt shout func go main class

参考:视频链接

没有class

go语言没有class,但是可以将方法可以被关联到你声明的struct类型,如下介绍了如何将方法关联到类型和构造函数:

package main

import (
    "fmt"
)

// 矩形结构体
type Rectangle struct {
    Length int
    Width  int
}

// 计算矩形面积
func (r *Rectangle) Area() int { // 将方法Area()关联到Rectangle类型上。  // Area开头的大写代表方法是public
    return r.Length * r.Width
}

// 模拟构造函数
func New(Length, Width  int) Rectangle{ // 一般将new开头的函数当作类型的构造函数,当然也可以直接叫new
    return Rectangle{Length ,Width  }
}

func main() {
    r := Rectangle{4, 2}
    // 调用 Area() 方法,计算面积
    fmt.Println(r.Area())
}

指针

go指针与c++指针的区别:

  • 指针和普通变量访问数据成员和方法,都是使用".",而不是"->"
  • 使用指针作为方法的接收者,那么才能在方法中修改数据成员。

指针与接口:

package main

import(
        "fmt"
        "strings"
)

type talker interface {
        talk() string
}
func shout(t talker) {
        louder := strings.ToUpper(t.talk())
        fmt.Println(louder)
}
type martian struct{}
func (m martian) talk() string {
        return "nack nack "
}

type laser int

func(l *laser) talk() string{
  return strings.Repeat("pew", int(*l))
}


func main() {
        shout(martian{})
        shout(&martian{})
        
        pew := laser(2)
        shout(&pew)
        // shout(pew)  // 错误
}

指向laser类型的指针满足了接口的类型,laser的类型并不满足接口的类型,所以shout(pew)会出错。

goroutine与channel

goroutine:协程,并发执行的代码。

package main
​
import (  
    "fmt"
)
​
func hello() {  
    fmt.Println("Hello world goroutine")
}
func main() {  
    go hello() // 开启一个协程
    fmt.Println("main function")
}

channel:

ch := make(chan int) // ch 的类型是 chan int
ch <- x // 将x发送到通道中
x = <-ch // 将通道中的数据接收到x上
<-ch     // 丢弃通道中接收的东西

close(ch) // 关闭

接受时:等待另一个goroutine向通道中发送数据。
发送时:等待另一个goroutine将通道中的数据取走。

简单的channel实例:

package main
import (
  "fmt"
  "time"
)
func main() {
  c := make(chan int)
  for i:=0; i<5; i++ {
      go sleepyGopher(i, c)
  }
  for i:=0; i<5;i++ {
    gopherID := <-c    // 多个goroutine向通道中发送数据,每次接收一个
    fmt.Println( "gopher" ,gopherID," has finished sleeping")
  }
}
func sleepyGopher(id int, c chan int) {
  time.Sleep(3*time.Second)
  fmt.Println(" ..",id," snore ...")
  c<-id
}

结果是无序的输出:

 .. 0  snore ...
 .. 2  snore ...
gopher 0  has finished sleeping
 .. 3  snore ...
 .. 4  snore ...
gopher 2  has finished sleeping
gopher 3  has finished sleeping
gopher 4  has finished sleeping
 .. 1  snore ...
gopher 1  has finished sleeping

select与time.After:

package main
import (
  "fmt"
  "time"
)
func main() {
  c := make(chan int)
  fori:=0;i<5;i++ {
    go sleepyGopher(i, c)
  }
  timeout := time.After(2*time.Second) // timeout是通道,会在两秒以后向timeout中发送数据
  for i:=0;i<5;i++{
    select{ // 两秒以后timeout中将会有数据,程序就会return
    case gopherID :=<-c: // 所以只执行睡眠在两秒以内的goroutine
      fmt.Println("gopher ",gopherID, " has finished sleeping" )
    case <-timeout: 
      fmt.Println("my patience ran out")
      return 
    }
  }
}

func sleepyGopher(id int, c chan int) {
  time.Sleep( time.Duration( rand.Intn(4000))*time.Millisecond ) // 0~4秒的随机时间
  c <- id
}

C++协程一般指的是可以挂起和恢复的函数,go中通过goroutine执行并发代码,通过channel等待事件发送。

标签:语言,int,fmt,shout,func,go,main,class
From: https://www.cnblogs.com/codingbigdog/p/17537497.html

相关文章

  • Python Django 模版全解与实战
    本文首先介绍了Django模板系统的基础知识,接着探讨了如何安装和配置Django模板系统,然后深入解析了Django模板的基本结构、标签和过滤器的用法,阐述了如何在模板中展示模型数据,最后使用一个实际项目的例子来演示如何在实际开发中使用Django模板系统。Django模板系统的简介Django模......
  • vscode 远程 开发 centos7 c语言
    本地vscode,搭建centos7的c语言开发环境远程主机一台或本地虚拟主机一台;本地电脑需要安装vscode的软件,vscode下载链接;vscode需要安装remote-ssh插件*vscode的debug参考文档远程主机安装gccyuminstall-ygccgdb查看gcc是否安装成功,gcc-vvscode用远程开发工具链接......
  • argocd + kustomize 报错“rpc error: code = Unknown desc = Manifest generation er
    argocd+kustomize报错“rpcerror:code=Unknowndesc=Manifestgenerationerror(cached)” 报错内容报错内容为:rpcerror:code=Unknowndesc=Manifestgenerationerror(cached):`kustomizebuild.xiaowangTech/4.0/frontend/dingding-pc/manifests/overla......
  • golang struct interface 方法
    有一个结构体typemystructstruct{aint}如果想为这个结构体增加一个方法,就类似于C++或者Java的类一样,有成员变量,也有成员函数,怎么实现呢?由于go没有类的概念,所以提供了一种方案。func(msmystruct)test()int{returnms.a}就是按照定义函数的方式,只不过在前面......
  • 解决MongoDB之Gridfs的具体操作步骤
    MongoDB之GridFS什么是GridFSGridFS是MongoDB的一种存储文件的方式,它可以用于存储和检索大型文件。在传统的MongoDB中,适合存储的文件大小通常限制在16MB以内,而GridFS可以突破这个限制,支持存储非常大的文件。GridFS将大文件分割为小块,每个小块都被存储为一个MongoDB文档。同时,Gri......
  • 如何实现MongoDB 能存储多少张表哦的具体操作步骤
    MongoDB能存储多少张表?概述MongoDB是一种非关系型数据库,采用文档存储方式,并以集合(Collections)来存储数据。在MongoDB中,并不存在传统关系型数据库中的“表”(Table)的概念,而是使用集合来存储文档。在MongoDB中,每个文档都是一个键值对的集合,类似于JSON对象。一个集合中可以......
  • 解决Java语言函数的定义的具体操作步骤
    Java语言函数的定义函数是编程语言中最基本的构建块之一,它是一段可以重复使用的代码块,用于执行特定的任务或计算。在Java语言中,函数也被称为方法,它们是由一系列语句组成的代码块,用于执行特定的操作。函数的定义和语法在Java语言中,函数的定义需要以下几个关键要素:函数签名:函数......
  • Go语言基础-Go语言基础语法入门
    第01天上午01课程内容1初识GO语言2开发环境搭建3第一个程序(程序结构)4基本组成元素:标识符、运算符、分隔符5变量、作用域6常量、7数据类型:布尔型整数浮点数字符串指针8流程控制:ifswitchforbreakcontinue9作业:①打印乘法口诀②猜数字 001初识......
  • c语言刷dfs和bfs合集(含回溯)
    目录1.dfs和bfs区别,解决不同的问题2.bfs3.dfs1.dfs和bfs区别,解决不同的问题通常来说,BFS适用于求最短路径,DFS用来解决最长匹配、连通性这些问题比较方便【例1】1091.二进制矩阵中的最短路径链接1:https://leetcode.cn/problems/shortest-path-in-binary-matrix/solution/......
  • C语言:数据结构之单链表(二)
    上一篇随笔谈了谈单链表是什么东西,然后进行了初始化,这篇随笔就开始对其进行操作了,首先是增,删,改,查的增。增,顾名思义就是要增加新的元素,单链表是链式的,那就要考虑怎么去加新元素,有三种,从头部添加,从尾部添加,从中间添加。先说说从尾部添加,这个比较好理解,直接在尾部放一个结点......