这几天学了Go语言的结构体、切片、映射、数组、函数闭包。接下来分类进行总结,自己做总结,也希望能帮助到那些想学go的同学。
1.结构体通用格式:
type 结构体名 struct{
数据 数据类型
}
示例代码:
//学习结构体
package main
import "fmt"
//结构体格式 type Structname struct{data}
type Vertex struct {
X int
Y int
}
//输出结构体
func main() {
fmt.Println(Vertex{1,3})
}
2.结构体指针 :
结构体指针有点类似于C++的指针类型,表示地址。但是一个很重要的区别在于:Go语言的结构体指针连接的形式采用的是.进行连接,而非->形式或者(*).形式。
示例代码:
//结构体指针
package main
import (
"fmt"
)
type Vertex struct{
X int
Y int
}
//指针的重点在于,直接用p.X 而非p->x 或者(*p).X形式,这点要记住
func main(){
v:=Vertex{1,3}
p:=&v //传递地址给p
p.X = 1e9
fmt.Println(p.X)
}
3.结构体地址返回
用&可以返回结构体地址,但是一个重点在于结构体取地址不返回具体的地址。
示例代码:
package main
import "fmt"
type Vertex struct {
X,Y int
}
//设置变量
var(
v1 = Vertex{1,2}
v2 = Vertex{X:1} //Y就被隐性赋值为0
v3 = Vertex{}
p = &Vertex{1,2} //p为该结构体地址
m = 1
f = &v1
)
//结构体不返回具体的地址
func main(){
fmt.Println(v1,p,f)
}
4.结构体内的值修改
可以直接修改里面的值,用取地址的形式和.的形式都可以
示例代码:
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main(){
//可以修改结构体的值,类似于c++
v:=Vertex{1,2}
v.X = 3
fmt.Println(v.X)
}
结构体方面暂时先总结到这,等后续应用到再总结。
二、切片1.切片格式:
[切片元素个数]切片类型{
具体数据
}
示例代码:
//go语言
package main
import "fmt"
func main(){
//数组参数中间需要加,
names := [4]string{
"Jons",
"Paud",
"ss",
"dd",
}
fmt.Println(names)
}
2.切片文法:
切片文法的数据在于它的数据类型可以支持多种,包括int、bool、struct等多种类型
示例代码:
//切片文法
package main
import "fmt"
func main(){
q:=[]int{2,3,1,4,4} //他会自动识别
fmt.Println(q)
r:=[]bool{true,false,true,true,false}
fmt.Println(r)
//可以用结构体作为它的数据类型
s:=[]struct{
i int
b bool
}{
{2, true},
{3, false},
{5, true},
{7, true},
{11, false},
{13, true},
}
fmt.Println(s)
}
3.求切片长度、容量
切片长度即为有包含数据的长度,切片容量指的是切片的大小。
切片长度只跟初始位置相关。其中切片长度和容量均为0时,则该切片==nil
示例代码:
//切片的长度于容量
package main
import "fmt"
func printSlice(s[]int){
fmt.Printf("len = %d cap=%d %v\n",len(s),cap(s),s)
}
func main(){
s:=[]int{2,3,5,7,11,13}
printSlice(s)
s=s[:0]
printSlice(s)
s = s[:4]
printSlice(s)
s = s[3:]
printSlice(s)
}
4.range用法:
切片中的range有点类似于for的遍历,主要作用在于遍历切片中的每个数据
示例代码:
package main
import "fmt"
var pow = []int{1,2,4,56,6}
//range循环切片映射时,返回值param1:下标,2:下表对应参数
func main(){
for i,v:=range pow{
fmt.Printf("%d:%d\n",i,v)
}
}
range返回值第二个值时可以省略的
示例代码:
package main
import (
"fmt"
)
func main(){
pow:=make([]int,10)
for i:=range pow{
pow[i] = 1 << uint(i) //2的0次方啥的,类似于二进制表达
}
for _, value := range pow {
fmt.Printf("%d\n", value)
}
}
三、go指针:
1.表达形式:
go指针的表达形式通常为&数据。表达数据的地址,这点如果学了C++的应该会更有理解。
*相当于取该地址的值,适用于大部分数据类型,结构体有点特殊,上面代码有讲到。
示例代码:
//学习go指针
package main
import "fmt"
func main(){
i,j:=42,2701
p:=&i //把i的地址赋给p
fmt.Println(*p)
*p = 21
fmt.Println(i)
p = &j
*p = *p/37
fmt.Println(j)
}
四、数组
1.数组格式:
var 数组名[数组个数]数据类型={具体数据}
示例代码:
//学习数组
package main
import "fmt"
func main() {
var a[2]string
a[0] = "Hello World"
a[1] = "Bing"
fmt.Println(a[1])
fmt.Println(a) //直接返回数组的形式 中间没有句号
primes := [7]int{2, 3, 5, 7, 11, 13} //后半部分中[7]表示数组的长度,如果后面数据低于这个,自动赋值0
fmt.Println(primes)
}
2.make用法:
make主要用来创建数组的:语法: a:=make([]int,5) //表示创建长度为5的类型为int的数组
示例代码:
package main
import "fmt"
func main(){
a:=make([]int,5) //create a array that length = 5
printSlice("a",a)
b:=make([]int,0,5)
printSlice("b",b)
c:=b[:2]
printSlice("c",c)
d:= c[2:5]
printSlice("d",d)
}
func printSlice(s string,x[]int){
fmt.Printf("%s len=%d cap = %d %v \n",s,len(x),cap(x),x)
}
映射有点类似于C++的字典。
1.语法:var m map[string]int //表示的是 创建一个映射名为m的 key类型为string val类型为int的数据集
示例代码:
//学习映射
package main
import "fmt"
type Vertex struct {
Lat,Long float64
}
var m map[string]Vertex
func main() {
m = make(map[string]Vertex)
m["Bell Labs"] = Vertex{
49.22,-888,
}
fmt.Println(m["Bell Labs"])
}
六、函数:
函数可以以另一个函数作为返回值:
示例代码:
package main
import (
"fmt"
"math"
)
func compute(fn func(float64,float64) float64)float64{
return fn(3,4)
}
func main() {
hypot := func(x,y float64)float64 {
return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(5,12))
fmt.Println(hypot(5,12))
fmt.Println(compute(hypot))
fmt.Println(compute(math.Pow))
}
剩余的有一块关于闭包函数的 本人还未完全理解,待理解之后补上,总体的基础基本上讲解完毕,希望对大家有用,当然也有不足,毕竟我也是刚学习几天。