前言: go语言的第四篇文章,主要讲述go语言中的方法,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示例,可直接运行。


方法,接口及并发

方法

方法就是一类带特殊的接收者(struct)参数的函数

  • 通过 结构体.方法 调用

    示例:
type city struct {
name, address string
} func (c city) sysCity() {
c.name = "帝都"
fmt.Println(c.name, c.address)
} func testFunc() {
c := city{
"北京", "二环",
}
c.sysCity()
fmt.Println(c)
}
  • fmt.Println(c)输出的还是{北京 二环},并没有因为在sysCity()中给c.name赋值而改变结构体的值

指针接收者

上面说过可以指针去改变结构体的值,所以也可以通过指针接收者去改变结构体的值

//就在struct类型前加个*就是获取结构体指针了
func (c *city) sysCity() {
c.name = "帝都"
fmt.Println(c.name, c.address)
}
  • 尝试输出一下

接口

使用 interface关键字表示一个接口,接口是由一组方法签名定义的集合

示例:

//接口
type adder interface {
syso()
}
//隐式调用,无需声明
func (x city) syso() {
fmt.Println(x.name, x.address)
}
func main() {
var var1 adder
var2 := city{
"长安", "皇城",
}
var1 = &var2
var1.syso() //还可以简写成这样
var var3 adder = city{
"帝都", "皇城",
}
var3.syso()
}

空接口:interface {} 没有方法

为了判断 一个接口值是否保存了一个特定的类型,类型断言可返回两个值:其底层值以及一个报告断言是否成功的布尔值。

例:t, ok := i.(T)

若 i 保存了一个 T,那么 t 将会是其底层值,而 ok 为 true。

否则,ok 将为 false 而 t 将为 T 类型的零值,程序并不会产生恐慌。

func main() {
var i interface{} = "this go"
v, ok := i.(string)
fmt.Println(v, ok)
v, ok := i.(int)
}

并发

命令 go 新起一个线程叫go程,go程相当于另起一个线程

示例:

func hello(x string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(x)
}
}
func main() {
go hello("go")
hello("say")
}
  • 输出 say go

信道

信道是带有类型的管道,你可以通过它用信道操作符 <- 来发送或者接收值。

(“箭头”就是数据流的方向)

func sum(x int, var1 chan int) {
sum := x
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
sum = sum + i
}
var1 <- sum
}
func main() {
var1 := make(chan int)
go sum(10, var1)
go sum(20, var1)
x, y := <-var1, <-var1
fmt.Println(x + y)
}

ch := make(chan int, 100)

  • 100指定缓冲大小
  • 我的理解就是信道里可以容纳的量

    尝试输出以下两段代码,或者将1改成2,体验下区别:
func main() {
ch := make(chan int, 1)
ch <- 21
fmt.Println(<-ch)
ch <- 100
fmt.Println(<-ch)
}
func main() {
ch := make(chan int, 1)
ch <- 21
ch <- 100
fmt.Println(<-ch)
fmt.Println(<-ch)
}

##结束语
**初识 go 语言系列**
- [x] 初识 go 语言
- [x] 初识 go 语言:语法
- [x] 初识 go 语言:数据类型
- [x] 初识 go 语言:方法,接口及并发

欢迎关注我的公众号

初识 go 语言:方法,接口及并发的更多相关文章

  1. 《Go并发编程实战》读书笔记-初识Go语言

    <Go并发编程实战>读书笔记-初识Go语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讲解怎样用Go语言之前,我们先介绍Go语言的特性,基础概念和标准命令. 一. ...

  2. 第二百五十八节,Tornado框架-逻辑处理get()方法和post()方法,初识模板语言

    Tornado框架-逻辑处理get()方法和post()方法,初识模板语言 Tornado框架,逻辑处理里的get()方法,和post()方法 get()方法,处理get方式的请求post()方法,处 ...

  3. 初识 go 语言:数据类型

    目录 数据类型 指针 结构体 数组 切片 切片的方法 映射 函数闭包 结束语 前言: go语言的第三篇文章,主要讲述go语言中的数据类型,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示 ...

  4. 初识 go 语言:语法

    目录 语法 for 循环 if 语句 switch 语句 defer 语句 defer 栈 结束 前言: go语言系列第二篇,主要讲述go语言的语法,如循环,if判断,swich语句,defer语句, ...

  5. 初识 go 语言

    目录 go简介 安装 hello world 函数 变量 常量 可见性规则 结束 前言: 最近组内要试水区块链,初步方案定为使用fabirc来弄,而fabric的智能合约就是用go写的,借此机会正好学 ...

  6. 初识Django —Python API接口编程入门

    初识Django —Python API接口编程入门 一.WEB架构的简单介绍 Django是什么? Django是一个开放源代码的Web应用框架,由Python写成.我们的目标是用Python语言, ...

  7. Go学习笔记:初识Go语言

    Go语言简介 Go语言是Google(谷歌)公司开发的一款静态型.编译型并自带垃圾回收机制和并发的编程语言. Go语言的风格类似于C语言.其语法在C语言的基础上进行了大幅的简化,去掉了不需要的表达式括 ...

  8. R语言数据接口

    R语言数据接口 R语言处理的数据一般从外部导入,因此需要数据接口来读取各种格式化的数据 CSV # 获得data是一个数据帧 data = read.csv("input.csv" ...

  9. Java接口多线程并发测试 (一)

    本文为作者原创,禁止转载,违者必究法律责任!!! 本文为作者原创,禁止转载,违者必究法律责任!!! Java接口多线程并发测试 一,首先写一个接口post 请求代码: import org.apach ...

随机推荐

  1. Windows系统下搭建Git本地代码库

    近由于工作需要,要把工作代码做一下版本管理.工作代码也不方便放到github上,也不想付费建私密库,公司也没几个人,所以就想着搭建一个本地Git版本库,来做版本管理.搭建过程如下. 系统环境:Dell ...

  2. 解决service iptables save出错please try to use systemctl

    # service iptables save The service command supports only basic LSB actions (start, stop, restart, t ...

  3. 浅谈TCP IP协议栈(四)IP协议解析

    通过之前的网络层基础知识,IP地址以及路由器的简介,大家应该对于TCP/IP有一个大致的了解,在脑海里应该对于网络的几个基础概念有个大概的了解,简单点说整个协议栈就是在做一件事,规定网络报文(网络传输 ...

  4. Linux学习历程——Centos 7 tar命令

    一.命令介绍 tar命令用于对文件进行打包压缩或解压. tar常用参数 参数 作用 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包内有哪些文件 -r 向压缩归档末尾追加文件 -u 更新压缩包 ...

  5. 龙尚 U9300C wvdial 拨号上网

    龙尚 U9300C    7模   4G LTE   (国内全网通) 接入linux系统会有4个串口 其中ttyUSB2 为AT指令口 ttyUSB1 为拨号上网口 wvdial   拨号入网参数 [ ...

  6. chome(谷歌浏览器)上传文件崩溃/上传图片崩溃/打开浏览文件未响应 解决方案

    测试解决方案:关闭搜狗输入法(我用的是搜狗输入法,若使用其他输入法,此方案也可能适用),再测试是否重现浏览器崩溃问题 可选解决方案:升级搜狗输入法(如果想 卸载输入法 也可以) 前面有段时间chome ...

  7. 持续代码质量管理-SonarQube Scanner部署

    1. SonarQube Scanner地址 上一篇文章我们安装了SonarQube-7.3,让我们可以在页面查看代码质量.但是具体的扫描工作则需要SonarQube Scanner完成. 下载页面 ...

  8. Kafka leader副本选举与消息丢失场景讨论

    如果某个broker挂了,leader副本在该broker上的分区就要重新进行leader选举.来简要描述下leader选举的过程 1.4.1 KafkaController会监听ZooKeeper的 ...

  9. jq轮播图插件—手写

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  10. web框架开发-Django用户认证组件

    可以用认证组件做什么 针对session的缺陷, 跟新数据时,不跟新key键, 用户认证组件是删除后再重建 用户认证组件很多功能可以直接使用 利用用户认证表(auth_user,通过Django自己创 ...