前言: 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 语言:方法,接口及并发
原文出处:http://www.cnblogs.com/cmyxn/p/9332530.html