通向惊恐的nil指针123456789package mainimport "fmt"func main() { var nowhere *int fmt.Println(nowhere) //fmt.Println(*nowhere) //针对nil指针的解引用会使程序崩溃}
保护方法12345678910111213141516package mainimport "fmt"type person struct { age int}func (p *person) birthday() { p.age++}func main() { var nobody *person fmt.Println(nobody) //nobody.birthday()//造成惊恐导致程序崩溃}
修改
1234567891011121314151617181920package mainimport "fmt"type person struct { ...
编程语言
未读概念指针是指向另一个变量的地址的变量,是一种间接访问的形势
&和*go语言的指针采用了C语言的指针语法,在这类语法中我们需要关注&(与符号)和*(星号)
123456789101112package mainimport "fmt"func main() { answer := 100 fmt.Println(&answer) address := &answer fmt.Println(*address)//星号对地址变量进行取值,address变量没有存储数值100,但是它存储了内存地址,这个内存地址里面存放了100}
123456789101112package mainimport "fmt"func main() { canada := "Canada" var home *string //声明home变量为string类型的指针 home = &canada//将canada变量的内存地址赋给home fmt.Println(*home ...
编程语言
未读概念圆珠笔是一个确切的用于写字的物品,而能够用于写字的物件是一个抽象概念,其中不只有圆珠笔这一个物品,代码中的int,string类型是一个确切的类型,而接口则表达了一种抽象的概念
int类型用于存储整数,string类型用于存储文本,他们非常关心自己存储了什么
接口不关心存储的东西,接口只关心能够做什么
接口类型1234567891011121314151617181920212223242526package mainimport "fmt"var t interface { talk() string //任何类型只要它声明的talk方法不接受参数并且返回字符串,那么他就可以作为接口t的值}type martian struct{}type laser intfunc (m martian) talk() string { return "martian"}func (l laser) talk() string { return "laser" ...
合并结构12345678910111213141516171819202122232425262728package mainimport "fmt"// type report struct {// sol int// high, low float64 //当我们需要更多的数据时这种写法显得不够灵活,这里的high和low也不好根据含义判断// lat, long float64// }type temperature struct { high, low float64 //在这里我们根据结构名一眼dingzhen,鉴定high,low为温度}type location struct { lat, long float64}type report struct { sol int tem temperature //在结构中插入其他的结构类型,当小的结构类型需要调整时对大结构的影响相对较小 location location}func main ...
go语言不支持类和对象,也不支持继承,但是通过go提供的结构和方法可以实现面向对象设计的概念
绑定方法到结构DMS格式,度,分,秒表示坐标,每60秒为一分,每60分为一度,编写一个decimal()方法实现将坐标转换为十进制单位为度
123456789101112131415161718192021222324package mainimport "fmt"type coordinate struct { d, m, s float64 h rune}func (c coordinate) decimal() float64 { sign := 1.0 switch c.h { case 'S', 'W', 's', 'w': sign = -1 } return sign * (c.d + c.m/60 + c.s/3600)}func main() { //布莱德柏利着陆点,南纬4度35分22.2秒, ...
编程语言
未读我们目前学的数据收集器都是针对同种类型而言,但是在实际编程中需要吧不同类型的数据综合到一起,比如一个人,姓名,年龄等等各个方面,数据类型不同就需要好几个数组或者切片之类的,明显不合适
声明结构curiosity:好奇,在例子里代表一个探测器,lat与long代表探索的经纬度
123456789101112import "fmt"func main() { var curiosity struct { lat float64 long float64 } curiosity.lat = -4.5859//采用结构体.属性名的方式赋予属性值 curiosity.long = 137.4417 fmt.Println(curiosity.lat) fmt.Println(curiosity.long)}
类型复用结构12345678910111213141516171819package mainimport "fmt"func main() { type location struct ...
编程语言
未读概念数组和映射使用序列整数作为索引查找指定元素的方式在针对某些特定元素的时候查找数据比较麻烦,而映射采用键值对的的方式存储数据,利用键去寻找指定的元素,而键的类型可以试几乎所有的类型
声明映射123456789101112131415161718package mainimport "fmt"func main() { temperature := map[string]int{ //定义一个map存放星球表面的温度 "Earth": 15, "Mars": -65, } temp := temperature["Earth"] fmt.Println("地球表面温度为", temp, "度") temperature["Earth"] = 16 fmt.Println(temperature) Venus := temperature["Venus"]//与数组切片不同的是当访问映射不存在的 ...
append函数数组中包含固定的元素,而切片只不过是指向数组的视图,这就为我们提供了更多的便利,比如为切片追加元素
太阳系中识别出了5颗矮行星,但是实际数量很可能不只5颗
123456789101112package mainimport "fmt"func main() { dwarfs := []string{"Ceres", "Pluto", "Haumea", "Makemake", "Eris"} fmt.Println(dwarfs) dwarfs = append(dwarfs, "Orcus")//append是一个可变参数的函数,可以一次性向切片追加多个元素 fmt.Println(dwarfs)}
长度和容量编写一个函数打印切片的长度和容量
123456789101112131415package mainimport "fmt"func dump(label st ...
编程语言
未读数组概念固定长度并且有序的一种集合,用于收集同种类型的元素
声明数组并访问元素声明两个数组1234567891011121314151617181920package mainimport "fmt"func main() { var name [3]string //长度为3的string类型数组,看数组名称是为了存放姓名 var age [3]int //长度为3的int类型数组,看数组名称是为了存放年龄 name[0] = "xiu" //数组的第一个元素从0开始计数,所以n个元素最大的索引为n-1 name[1] = "小明" name[2] = "小红" age[0] = 18 age[1] = 7 age[2] = 8 fmt.Printf("姓名:%v\n年龄:%v", name[0], age[0])}
注意不要索引越界,上述两个数组长度都为3,当我们访问name[3]的时候编译就会报错,千万记住索引是从0开始
快速初始化数组planets: ...
编程语言
未读函数赋值给变量气象传感器气象传感器回提供150-300区间的开氏温度,我们创建一个待实现的真实传感器以及一个随机数的虚假传感器
123456789101112131415161718192021package mainimport ( "fmt" "math/rand")type kelvin float64func fakeSensor() kelvin{ return kelvin(rand.Intn(151)+150)}func realSensor() kelvin{ return 0}func main() { var sensor func() kelvin//声明一个函数类型的变量sensor,返回值为kelevin类型 sensor = fakeSensor//注意这个地方直接吧函数fakeSensor本身赋值给sensor,没有加括号就是没有调用函数 fmt.Println(sensor())}
函数传递给其他函数需求:每两秒调用一次虚假传感器函数,那我们需要借助 ...










