前言: 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. Android 为TV端助力

    记录两次事情: 第一个给view添加动画效果,需要保证view是可以获取焦点的 第二个给listview,GridView设置选择器 listselector时,要保证他的子item无背景,否则选择器 ...

  2. 设计模式系列之过滤器模式(Chriteria Pattern)

    过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这种类 ...

  3. DedeCMS清空删除所有文档后新建文档信息ID从1开始

    方法一.登录织梦后台,找到系统->系统设置->SQL命令行工具 分别运行以下命令: 清除表中的数据,删除所有文章: truncate table `dede_arctiny`; trunc ...

  4. c# 多线程委托传参方式

    1.定义一个线程调用的方法函数 private void RTPServer(object _Serverip) { IPEndPoint Serverip = _Serverip as IPEndP ...

  5. SQLServer之创建分布式事务

    分布式事务创建注意事项 指定一个由 Transact-SQL 分布式事务处理协调器 (MS DTC) 管理的 Microsoft 分布式事务的起点. 执行 BEGIN DISTRIBUTED TRAN ...

  6. CentOS 6.2 中文

    在虚拟机里面安装好centos6.2之后,默认是英文!   对于命令行操作无所谓啦,但是如果想看界面,就不是很适应!   修改方法如下:   1.用root登录系统,密码为创建虚拟机时候的密码.创建虚 ...

  7. SQLServer之修改FOREIGN KEY约束

    使用SSMS数据库管理工具修改FOREIGN KEY约束 1.连接数据库,选择数据表->右键点击->选择设计(或者展开键,选择要修改的外键,右键点击,选择修改,后面修改步骤相同). 2.在 ...

  8. docker容器日志收集方案(方案四,目前使用的方案)

    先看数据流图,然后一一给大家解释 ​ 这个方案是将日志直接从应用代码中将日志输出到redis中(注意,是应用直接连接redis进行日志输出),redis充当一个缓存中间件有一定的缓存能力,不过有限,因 ...

  9. 网络流问题 P2763 试题库问题

    题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法. ...

  10. web框架开发-Django模型层(2)-多表操作

    很重要,都是精华 多表关系模型 一对一 一旦确定表关系是一对一,在两张表中的任意一张表中建立关联字段+Unique 一对多 一旦确定表关系是一对多,创建关联字段在多的表中 多对多 一旦确定表关系是多对 ...