Golang快速入门-2(Day5)

那就接续着昨天的内容,今天提到的也是大家常用的function及slice

function

go在宣告function的方式如下
func <function名称> (<引入的变数名称> <引入的变数类别>) (<回传变数(选填)> <回传类别>) {
// 做一些事
}

package main

import "fmt"

func printHelloWorld() {
    fmt.Println("Hello World")
}

func printSomeThing(input1 string) {
    fmt.Println("output", input1)
}

func addSomething(input string) string {
    return input + "!!!"
}

func main() {
    printHelloWorld()
    printSomeThing("this is output")
    var x string
    x = addSomething("Good")
    fmt.Println(x)
}

但在go的function中,除了引入的变数的可以是0~很多个,输出也可以0~很多个,范例如下

package main

import "fmt"

func swap(x string, y string) (string, string) {
	return y, x
}

func main() {
    var a string
    var b string
    a, b = swap("hello", "world")
    fmt.Println(a, b)
}


另外,在go的function中,还有一个特别的用法,可以在回传的变数那边先打上预设想要回传的内容,他就会在function的最一开始帮你宣告好这几个变数,之後只要在function中打上return即可,当然如果你接下来还是有内容想要回传,也可以不受这个限制影响,只要型态是一样的就可以了

package main

import "fmt"

func swap(x string, y string) (output1 string, output2 string) {
	output1 = y
    output2 = x
    if x == "foo" {
        return "bar", "bar"
    }
    return
}

func main() {
    var a string
    var b string
	a, b = swap("hello", "world")
	fmt.Println(a, b)
    a, b = swap("foo", "world")
	fmt.Println(a, b)
}

defer
这是golang的特别功能,主要的功能是当你使用了这个语法,他就会将他後面的内容挪到你的function执行结束後才会执行(顺序为由下往上的执行)

func testDefer() {
    defer fmt.Println("1")
    defer fmt.Println("2")
    defer fmt.Println("3")
    defer fmt.Println("4")
    defer fmt.Println("5")
    fmt.Println("Hello")
}
testDefer()

输出结果

Hello
5
4
3
2
1

Slice

Slice是golang独有的资料型态,可以先把它视为可以扩充的array
他的用法如下


// 宣告
var peopleNames []string 
var peopleSex []string = []string{"male","female"}
peoplePhoneNumber := []string{"0912345678","0987654321"}

fmt.Println("peopleSex", peopleSex)
fmt.Println("peoplePhoneNumber", peoplePhoneNumber)
// 将资料放到slice
fmt.Println("peopleNames", peopleNames)
peopleNames = append(peopleNames, "Peter")
fmt.Println("peopleNames", peopleNames)
peopleNames = append(peopleNames, "John", "Eric")

// 取得slice有几个值(length)

fmt.Println("peopleNames len", len(peopleNames))

// 取其中的值
fmt.Println("people name =>", peopleNames[1]) // John

// 对slice里的值做回圈操作
for index, name := range peopleNames {
    fmt.Println("index", index)
    fmt.Println("name", name)
}
// 如果你只需要slice的值,不需要index的话,就可以用_来作替代
for _, name := range peopleNames {
    fmt.Println("name", name)
}

map

在golang中,slice是用数字来代表其中每个object的位置,而map就可以透过其他属性的内容来找到相对应的object的位置,这个会常常与未来会提到的interface一起使用,来承接json物件的东西

person := make(map[string]string)
person["name"] = "Kevin"
person["address"] = "Taipei"
x := "address"
fmt.Println(person)
fmt.Println(person["name"]) // Kevin
fmt.Println(person[x]) // Taipei

<<:  自动化测试,让你上班拥有一杯咖啡的时间 | Day 3 - 开始写第一个测试

>>:  Golang快速入门-3(Day6)

DAY9 - BFS应用

昨天写了BFS模板&一题模板题,今天放几题比较复杂的~~ 例题实战 909. 蛇梯棋 这题最...

基础建设:分散式服务追踪

微服务系统之间的呼叫链结可能错纵复杂,除了系统日志(Logging)和监控指标(Metrics),链...

CMoney软件工程师战斗营_期末专题制作_Week 16

第十六周噜 专题进行了两周 目前进度就是 刻了一些画面做了一些功能 做好注册与登入功能 在刻画面的时...

[ 卡卡 DAY 2 ] - React Native 是什麽? 原理?优点?

起源 於 2015 年 3 月 Facebook 开放了 React Native 的原始码,让使...

# Day#18 设定、上传照片与default值

前言 昨天只写了注册与登入的功能,好像完全没有提到这到底是个什麽样的app... 那天,没有朋友的我...