go語言初體驗(流程控制、range遍歷、函式、結構體、面向物件)
阿新 • • 發佈:2018-11-13
一、流程控制
// main
package main
import (
"fmt"
)
func main() {
x := 2
switch x {
case 1:
fmt.Print("beifeng 1")
case 2:
fallthrough
case 3:
fmt.Print("beifeng 2")
default:
fmt.Print("beifeng 3")
}
}
二、range遍歷
// main.go package main import ( "fmt" ) func main() { x := "zhangsan" for _, v := range x { fmt.Printf("%c\n", v) } }
三、函式
左函式右返回值中間若干傳入引數
*傳指標的值,&指標的地址
函式是一等公民,也可以作為值、型別
3.1 函式傳值與傳指標
// func_1
package main
import (
"fmt"
)
func swap(a, b int) (int, int) {
return b, a
}
func add(a *int) *int {
*a = *a + 1
return a
}
func main() {
a := 1
add(&a)
fmt.Printf("%d", a)
}
3.2 匿名函式
函式作為具體的型別;變數指向具體的函式
/ main.go
package main
import (
"fmt"
)
func main() {
type sum func(x, y int) int
var f sum = func(x, y int) int {
return x + y
}
fmt.Println(f(3, 4))
}
3.3 函式中傳入切片引數
// fun_2 package main import ( "fmt" ) //求和函式,傳入一個動態整型陣列 func getSum(num []int) int { //初始化sum變數 sum := 0 //遍歷陣列,求和 for i := 0; i < len(num); i++ { sum += num[i] } //返回sum值 return sum } func main() { //初始化num整型切片變數 num := []int{1, 2, 3, 4, 5} fmt.Print(getSum(num)) }
3.4 defer函式
defer延遲的意思;後進先去
加入defer 的程式碼語句將會最後執行,同時也能儲存defer後面的程式碼能夠執行到
場景1:資源關閉
// defer.go
package main
import (
"fmt"
)
func main() {
for i := 1; i <= 5; i++ {
defer fmt.Println(i)
}
}
3.5 pannic
Go的異常處理機制
Panic 捕獲異常,程式掛
// panic.go
package main
import (
"fmt"
)
func main() {
defer func() {
fmt.Println("After panic from defer !") //panic之後 defer裡面的依然可以得到執行
}()
panic("I am panicing!")
fmt.Println("After panic!") //panic後面得不到執行
}
四、結構體struct
Go語言沒有private、protected、public這樣的關鍵字。
某個符號對其他包(package)可見(即可以訪問),
需要將該符號定義為以大寫字母開頭。
// main.go
package main
import (
"fmt"
)
type Person struct {
name string
age int
}
type Student struct {
Person
age int
speciality string
}
func main() {
student := Student{Person{"zhangsan", 25}, 30, "maths"}
fmt.Printf("%v %v", student.Person.age, student.age)
}
五、面向物件
類與方法
Golang:"A method is a function with an implicit first argument, called a receiver.“
func (r ReceiverType) funcName(parameters) (results)
型別和作用在它上面定義的方法必須在同一個包裡定義,這就是為什麼不能在 int、float 或類似這些的型別上定義方法。
類的初始化:point :=new(Point)
point :=&Point{}
point :=&Point{x:100, y:100}
point := Point{}
// main
package main
import (
"fmt"
)
/*func compare(a, b int) bool {
return a < b
}*/
//定義一個結構體Point
type Point struct {
px float32
py float32
}
//接收者point,接收型別結構體指標Point,方法setXY(),傳入引數px,py
func (point *Point) setXY(px, py float32) {
//定義接收者屬性
point.px = px
point.py = py
}
//接收者point 接收型別結構體指標Point,方法getxy(),返回兩個float32資料型別的值
func (point *Point) getXY() (float32, float32) {
//返回x,y值
return point.px, point.py
}
//定義一個結構體 Integer
type Integer struct {
//定義結構體的屬性
value int
}
func main() {
//初始化一個類
point := new(Point)
point.setXY(1.23, 4.56)
px, py := point.getXY()
fmt.Print(px, py)
}
5.1 面向物件之繼承、介面、介面賦值、any型別、型別查詢
在Go語言中,一個類只需要實現了介面要求的所有函式,我們就說這個類實現了該介面。
介面賦值有兩種方式:1、將物件例項賦值給介面;2、將一個介面賦值給另一個介面
Go語言中任何物件例項都滿足空介面interface{},interface{}可以接收所有資料型別
package main
import "fmt"
//定義一個Person結構體
type Person struct {
name string
age int
}
//接收者person,接收結構體型別Person, 方法getNameAndAge() 返回string,int值
func (person Person) getNameAndAge() (string, int) {
return person.name, person.age
}
type Student struct {
Person
speciality string
}
func (student Student) getSpeciality() string {
return student.speciality
}
//定義一個Animal介面,實現的方法有Fly() Run()
type Animal interface {
Fly()
Run()
}
type Animal2 interface {
Fly()
}
type Bird struct {
}
//通過接收者實現介面的方法
//接收者bird實現Fly()方法
func (bird Bird) Fly() {
fmt.Println("Bird is flying!!!!")
}
//接收者bird實現Run()方法
func (bird Bird) Run() {
fmt.Println("Bird is running!!!!")
}
func main() {
student := new(Student)
student.name = "zhangsan"
student.age = 26
name, age := student.getNameAndAge()
student.speciality = "computer"
speciality := student.getSpeciality()
fmt.Println(name, age, speciality)
//定義animal介面
var animal Animal
//定義animal2介面
var animal2 Animal2
//初始化一個物件bird
bird := new(Bird)
//將物件例項bird賦值給animal介面
animal = bird
//將animal介面賦值給animal2介面
animal2 = animal
//
//animal = bird //把類例項直接賦值給介面
//animal2 = bird
animal2.Fly()
animal2.Fly()
animal.Fly()
animal.Run()
//定義一個any型別的變數v1
var v1 interface{}
//賦值
v1 = "zhangsan"
switch v1.(type) {
case int:
case float32:
case float64:
fmt.Println("this is float64")
case string:
fmt.Println("this is string")
}
}