Golangは理解 - 関数宣言を

通常の関数宣言

通常の関数の形で声明

 
func 函数名(参数列表) (返回参数列表) {
        函数体 
}

パラメータタイプ速記

戻り値の1と同じタイプ

戻り値が同じタイプである場合、囲まれた戻り型の複数囲み、各コンマの戻り値の型によって分離します

return文、ニーズのリストの値の順序や関数の戻り値の型と一致を使用している場合

戻り値は、戻り値の同じタイプが表示された場合は特に、読みやすさのために友情の非常に純粋なタイプではない各戻りパラメータの意味を区別することはできません

func subAndSum(x, y int) (int, int) {
    sub := x - y
    sum := x + y
    return sub, sum
}
2.変数名と戻り値
func namedRetValues() (a, b int) {
        a = 1
        b = 2
        return
}

ときに指定された関数宣言の戻り値は、B;従って実施形態という関数の関数の戻り値は、関数の端部が返される前に表示されるリターンステートメントの本体に直接機能割り当ての値を返すことができます。

:例えば、同じ戻り値の型と戻り値の名前のみ混合した場合、コンパイルエラーが発生する、二つの形式のいずれかを選択

func namedRetValues() (a, b int, int)

関数呼出し

関数コール:変数リストの戻り値=関数名(パラメータリスト)

カンマ区切りリストの戻り値は、複数の、例えば:

a, b := namedRetValues()

例:将秒解析为时间单位

package main

// 将秒解析为时间单位

import (
        "fmt"
)

const (
    // 定义每分钟的秒数
    SecondsPerMinute = 60
    // 定义每小时的秒数
    SecondsPerHour = SecondsPerMinute * 60
    // 定义没天的秒数
    SecondsPerDay = SecondsPerHour * 24
)

// 将传入的秒解析为3种时间单位
func resolveTime(seconds int) (day, hour, minute int) {
    day = seconds / SecondsPerDay
    hour = seconds / SecondsPerHour
    minute = seconds / SecondsPerMinute
    // 显示return返回
    return
}

func main() {
    // 直接将返回值作为打印参数
    fmt.Println(resolveTime(1000))
    // 只获取小时和分钟
    _, hour, minute := resolveTime(18000)
    fmt.Println(hour, minute)
    // 只获取天
    day, _, _ := resolveTime(90000)
    fmt.Println(day)
}

関数のパラメータの受け渡し

言語を移動して、返すパラメータは、コールと引き換えに渡されます值传递

パラメータ渡しでは起こらないようなオブジェクトの種類としてポインタ、スライス、マップ参照は、コンテンツの複製が指すことに留意すべきではなく将指针进行复制、類似の参照を作成します。

:golangの試験函数参数传递为值传递引用类型参数为一次引用创建

package main
/*
        示例: 测试golang中函数参数传递为值传递; 引用类型参数为一次引用创建
*/

import (
        "fmt"
)

// 用于测试值传递效果的结构体
type Data struct {
    complax []int       // 测试切片在参数传递中的效果, 切片是一种动态类型,内部以指针存在
    instance InnerData  // 实例分配的innerData
    ptr *InnerData      // 将ptr声明为InnerData的指针类型
}

// 代表各种结构体字段; 声明一个内嵌的结构innerData
type InnerData struct {
        a int
}

// 值传递的测试函数; 
// 该函数的参数和返回值都是Data类型,在调用中,Data的内存会被复制后传入函数,当函数返回时,又将返回值复制一次,赋值给函数返回值的接收变量
func passByByValue(inFunc Data) Data {
    // 输出参数的成员情况
    fmt.Printf("in func value: %+v\n", inFunc)
    // 打印inFunc的指针
    fmt.Printf("in func ptr: %p\n", &inFunc)     // 值传递,需要使用&符号取地址; 拥有相同地址且类型相同的变量,表示同一块内存区域

    return inFunc   // 将传入的变量作为返回值返回,返回的过程中将发生值复制
}

// 测试流程,准备一个Data格式的数据结构并填充所有成员,通过调用测试函数,传入Data结构数据,并获取返回值,对比输入和
// 输出后的Data结构数据变化,特别是指针变化情况以及输入和输出整块数据是否被复制

func main() {
    // 准备传入函数的数据结构
    in := Data{
        complax: []int{1, 2, 3},
        instance: InnerData{
          5,
        },
        ptr: &InnerData{1},
        }

    // 输入结构的成员情况
    fmt.Printf("in value: %+v\n", in)

    // 输入结构的指针地址
    fmt.Printf("in ptr: %p\n", &in)

    // 传入结构体,返回同类型的结构体
    out := passByByValue(in)

    // 输出结构的成员情况
    fmt.Printf("out value: %+v\n", out)
    // 输出结构的指针地址
    fmt.Printf("out ptr: %p\n", &out)
}

概要

  1. すべてのポインタのアドレスデータ構造は、または値を返すことによって、すべての構造は、それがデータ構造内部関数に渡されているかどうか、新しいメモリであることを意味し、変更されているが、データのレプリケーション動作が発生返さ
  2. データ構造のすべてのメンバの値は、すべてのパラメータが値によって渡されることを意味し、転送の元の値が変更されません
  3. 転送中に一貫性のあるデータPTR部材構造、伝達関数ポインタパラメータ値のみポインタ値に渡され表し、ポインタの一部が複製されません

おすすめ

転載: www.cnblogs.com/vinsent/p/11221369.html