前言: 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 语言:方法,接口及并发
欢迎关注我的公众号