-
本章涉及标准库中的包比较多,看起来不是哪么轻松. 好吧,其实是哪些方法做什么的不知道 .查看全部
-
解压:$ sudo tar -zxf go1.9.1.linux-amd64.tar.gz -C /usr/local 测试:$ cd /usr/local/go $ bin/go version 设置:$ vim /etc/profile # 插入在最后一行 export GOROOT=/usr/local/go export GOPATH=~/golib:~/goproject export GOBIN=~/gobin export PATH=$PATH:$GOROOT/bin:$GOBIN $ source /etc/profile 完成:$ go version查看全部
-
Go语言-指针 指针操作涉及到两个操作符——&和*。这两个操作符均有多个用途。 但是当它们作为地址操作符出现时,前者的作用是取址,而后者的作用是取值。 更通俗地讲,当地址操作符&被应用到一个值上时会取出指向该值的指针值, 而当地址操作符*被应用到一个指针值上时会取出该指针指向的那个值。它们可以被视为相反的操作。 除此之外,当*出现在一个类型之前(如*Person和*[3]string)时就不能被看做是操作符了, 而应该被视为一个符号。如此组合而成的标识符所表达的含义是作为第二部分的那个类型的指针类型。 我们也可以把其中的第二部分所代表的类型称为基底类型。 例如,*[3]string是数组类型[3]string的指针类型,而[3]string是*[3]string的基底类型。 看结构体类型Person。它及其两个方法的完整声明如下: type Person struct { Name string Gender string Age uint8 Address string } func (person *Person) Grow() { person.Age++ } func (person *Person) Move(newAddress string) string { old := person.Address person.Address = newAddress return old } 注意,Person的两个方法Grow和Move的接收者类型都是*Person,而不是Person。 只要一个方法的接收者类型是其所属类型的指针类型而不是该类型本身,那么我就可以称该方法为一个指针方法。 上面的Grow方法和Move方法都是Person类型的指针方法。 相对的,如果一个方法的接收者类型就是其所属的类型本身,那么我们就可以把它叫做值方法。 我们只要微调一下Grow方法的接收者类型就可以把它从指针方法变为值方法: func (person Person) Grow() { person.Age++ } 定论:方法的接收者标识符所代表的是该方法当前所属的那个值的一个副本,而不是该值本身。查看全部
-
在Go语言中,一个接口类型总是代表着某一种类型(即所有实现它的类型)的行为。一个接口类型的声明通常会包含关键字type、类型名称、关键字interface以及由花括号包裹的若干方法声明。示例如下: type Animal interface { Grow() Move(string) string } 注意,接口类型中的方法声明是普通的方法声明的简化形式。它们只包括方法名称、参数声明列表和结果声明列表。其中的参数的名称和结果的名称都可以被省略。不过,出于文档化的目的,我还是建议大家在这里写上它们。因此,Move方法的声明至少应该是这样的: Move(new string) (old string) 如果一个数据类型所拥有的方法集合中包含了某一个接口类型中的所有方法声明的实现,那么就可以说这个数据类型实现了那个接口类型。所谓实现一个接口中的方法是指,具有与该方法相同的声明并且添加了实现部分(由花括号包裹的若干条语句)。相同的方法声明意味着完全一致的名称、参数类型列表和结果类型列表。其中,参数类型列表即为参数声明列表中除去参数名称的部分。一致的参数类型列表意味着其长度以及顺序的完全相同。对于结果类型列表也是如此。查看全部
-
go的使用查看全部
-
panic和recover查看全部
-
厉害的defer查看全部
-
切片类型生命 type slices []int 数组类型声明 type numbers [5]int 创建一个切片 []int{1,2,3} 创建一个数组 [...]int{1,2,3} [3]int{1,2,3} var numbers=[5]int{1,2,3,4,5} 对于数组,切片操作 var slices1=numbers[1:3] 对于切片,切片操作 var slices2=slices1[1:2] cap函数查看全部
-
数组声明 type numbers [3]int 数组类型的值 [3]int{1, 2, 3} 将数组字面量赋值给一个变量 var numbers = [3]int{1, 2, 3} var numbers = [...]int{1, 2, 3} 取数组长度 var length = len(numbers)查看全部
-
go函数的返回结果的声明 与形参的声明一样,并且,当只有一个返回值是,可以省略括号查看全部
-
go语言中的函数可以返回多个结果查看全部
-
通道 是Go语言中一种独特的数据结构,它可以用于在不同的Goroutine之间传递类型化的数据,并且是并发安全的, 通道类型的表示方法为:chan T (左边是代表通道类型的关键字chan ,而右边为可变部分,代表该通道类型允许传递的数据的类型, 注意:对通道值的重复关闭会引发运行是恐慌,这会使程序崩溃查看全部
-
言-函数 在Go语言中,函数是一等(first-class)类型。这意味着,我们可以把函数作为值来传递和使用。 函数代表着这样一个过程:它接受若干输入(参数),并经过一些步骤(语句)的执行之后再返回输出(结果)。 特别的是,Go语言中的函数可以返回多个结果。 函数类型的字面量由关键字func、由圆括号包裹参数声明列表、空格以及可以由圆括号包裹的结果声明列表组成。 其中,参数声明列表中的单个参数声明之间是由英文逗号分隔的。每个参数声明由参数名称、空格和参数类型组成。 参数声明列表中的参数名称是可以被统一省略的。结果声明列表的编写方式与此相同。结果声明列表中的结果名称也是可以被统一省略的。 并且,在只有一个无名称的结果声明时还可以省略括号。示例如下: func(input1 string ,input2 string) string 这一类型字面量表示了一个接受两个字符串类型的参数且会返回一个字符串类型的结果的函数。 如果我们在它的左边加入type关键字和一个标识符作为名称的话,那就变成了一个函数类型声明,就像这样: type MyFunc func(input1 string ,input2 string) string 函数值(或简称函数)的写法与此不完全相同。 编写函数的时候需要先写关键字func和函数名称,后跟参数声明列表和结果声明列表,最后是由花括号包裹的语句列表。例如: func myFunc(part1 string, part2 string) (result string) { result = part1 + part2 return } 如果结果声明是带名称的,那么它就相当于一个已被声明但未被显式赋值的变量。 我们可以为它赋值且在return语句中省略掉需要返回的结果值。该函数还有一种更常规的写法: func myFunc(part1 string, part2 string) string { return part1 + part2 } 注意,函数myFunc是函数类型MyFunc的一个实现。查看全部
-
Go语言-通道的更多种类 通道有带缓冲和非缓冲之分。缓冲通道中可以缓存N个数据。我们在初始化一个通道值的时候必须指定这个N。 相对的,非缓冲通道不会缓存任何数据。发送方在向通道值发送数据的时候会立即被阻塞, 直到有某一个接收方已从该通道值中接收了这条数据。 非缓冲的通道值的初始化方法如:make(chan int, 0) 缓冲的通道的初始化方法如:make(chan int, 5) 注意,非缓冲通道给予make函数的第二个参数值是0。而缓冲通道给予make函数的第二个参数值是一个确定的数值。 我们还可以以数据在通道中的传输方向为依据来划分通道。默认情况下,通道都是双向的,即双向通道。 如果数据只能在通道中单向传输,那么该通道就被称作单向通道。 我们在初始化一个通道值的时候不能指定它为单向。但是,在编写类型声明的时候,我们却是可以这样做的。例如: type Receiver <-chan int 类型Receiver代表了一个只可从中接收数据的单向通道类型。这样的通道也被称为接收通道。 在关键字chan左边的接收操作符<-形象地表示出了数据的流向。 相对应的,如果我们想声明一个发送通道类型,那么应该这样: type Sender chan<- int 这次<-被放在了chan的右边,并且“箭头”直指“通道”。 我们可以把一个双向通道值赋予上述类型的变量,就像这样: var myChannel = make(chan int, 3) //带缓冲的通道 var sender Sender = myChannel //发送通道 var receiver Receiver = myChannel //接收通道 但是,反之则是不行的。像下面这样的代码是通不过编译的: var myChannel1 chan int = sender 单向通道的主要作用是约束程序对通道值的使用方式。 比如,我们调用一个函数时给予它一个发送通道作为参数,以此来约束它只能向该通道发送数据。 又比如,一个函数将一个接收通道作为结果返回,以此来约束调用该函数的代码只能从这个通道中接收数据。查看全部
-
Myint类型仅拥有Decrease()方法…………什么意思查看全部
举报
0/150
提交
取消