Golang中子程序与参数传递的实现方法

Golang中子程序与参数传递的实现方法 你好

如何像在Python等其他语言中那样编写带有参数传递的子程序/函数?

另外,如何将数组写入文件?数组是否必须通过Go库函数转换为字节?

10 回复

感谢您提供的链接和书籍建议。我在 gobyexample 网站上查阅了函数和参数传递的相关内容,这解答了我的疑问。

将整数数组写入文本文件的最佳方式是什么?其中数组元素均为字节长度。

// 示例代码将在此处展示

更多关于Golang中子程序与参数传递的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


早上好

能否将计算得到的数字如 R = ( A + B ) mod 10(其中 A、B 和 R 为整数)追加进去,并用 append(xyz, R) 替换 xyz = append(xyz, j)?是否可以将 x 定义为字节变量并进行数学运算,例如 A + B?如果我将 A 和 B 定义为 []byte,能否用涉及数学运算的数值填充它们?

我正在处理一个包含786,000个元素的数组,该数组被定义为整数类型(var xyz [] int)。您的示例将int_array定义为[]byte。

我的程序对xyz数组进行数学运算:xyz[ j ] = a+b,其中a和b都是整数。我是否可以使用int_array[ j ] = a+b来获得相同的结果?是否必须使用for循环int_array[ j ] = xyz[ j ]?

0x23、0x45、0x67是否表示每个数组元素?我有数十万个这样的元素。

写入语句中的0644有什么作用?

我的整数数组包含标准的ASCII码数字(0到127)。我想将这个数组写入文本文件以便在另一个程序中使用。该数组定义为 xyz [] int,通过一个for循环加载,其中 xyz[ j ] = (a + B) mod 127。我可以直接编写 ioutil.WriteFileFile(xyz) 吗?还是需要将xyz数组转换为字节数组?如果需要,该如何操作?

我在GOExamples网站上找到了语句 di := []byte("Hello World")。然而,我处理的不是字符串。

func main() {
    fmt.Println("hello world")
}

0644 是 Unix/Linux/POSIX 系统中使用的八进制权限标志。

http://permissions-calculator.org/decode/0644/

我使用十六进制数字(0x23 等)是为了让你可以用十六进制转储程序检查输出文件,确认写入是否正确。

我使用 byte 类型(等同于 uint8)是因为你说你的整数可以放入字节中。我假设你的所有整数都足够小。如果你需要写入超过 8 位的整数(如 int16 或更大),则需要使用不同的方法。例如,可以查看 binary.Write()

https://golang.org/pkg/encoding/binary/#Write

你好 Charles,

首先,在 Go 语言中我们通常使用切片而非数组。随着你对 Go 的进一步学习,你会理解其中的原因。

我通常避免回答"什么是做某事的最佳方法?"这类问题,因为最佳方法取决于众多因素。不过,将字节切片写入文件的一种非常简单的方法是使用 ioutil.WriteFile()

https://golang.org/pkg/io/ioutil/#WriteFile

package main

import "io/ioutil"

func main() {
        const filename = "test.out"
        var int_array []byte = []byte{ 0x23, 0x45, 0x67 }

        ioutil.WriteFile(filename,int_array,0644)
}

针对你的具体需求,最佳方法可能会有所不同!

以下是三个免费的在线书籍,可以帮助你入门:

https://gobyexample.com/
https://www.miek.nl/go/
https://www.golang-book.com/books/intro

第三本书的作者还有一个由O’Reilly Media出版的修订版。此外还有许多非免费的书籍。我建议你看看William Kennedy的《Go in Action》(由Manning出版社出版)。我一直在观看他关于高级Go编程的视频课程《Ultimate Go Programming(第二版)》,他对于编程的普遍知识以及特别是Go语言的深刻理解给我留下了深刻印象。

另外,如果你还没有尝试过,可以参加Go语言之旅:

https://tour.golang.org/welcome/1

如果你能获取到的话,我本月在《Linux Journal》上发表了一篇关于Go语言的入门文章。

在Go语言中定义函数的方式如下:

func name(parameters) returned result(s) {
function body
}

将数组内容写入文件有多种方法,具体取决于你对数据的处理方式。

你好 Charles,

如果你只处理小于128的整数,使用字节大小的整数切片会比使用int类型的数组更简单。你可以使用byte类型(它是uint8的别名):

package main

import "io/ioutil"

var xyz []byte

const filename = "ascii.out"

func main() {
        var j byte

        for j = 0; j < 128; j++ {
                xyz = append(xyz,j)
        }
        ioutil.WriteFile(filename,xyz,0644)
}

$ go run ascii.go $ ls -l ascii.out

-rw-r--r-- 1 jay jay 128 Oct 11 11:26 ascii.out

$ hd ascii.out

00000000  00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f  |................|
00000010  10 11 12 13 14 15 16 17  18 19 1a 1b 1c 1d 1e 1f  |................|
00000020  20 21 22 23 24 25 26 27  28 29 2a 2b 2c 2d 2e 2f  | !"#$%&'()*+,-./|
00000030  30 31 32 33 34 35 36 37  38 39 3a 3b 3c 3d 3e 3f  |0123456789:;<=>?|
00000040  40 41 42 43 44 45 46 47  48 49 4a 4b 4c 4d 4e 4f  |@ABCDEFGHIJKLMNO|
00000050  50 51 52 53 54 55 56 57  58 59 5a 5b 5c 5d 5e 5f  |PQRSTUVWXYZ[\]^_|
00000060  60 61 62 63 64 65 66 67  68 69 6a 6b 6c 6d 6e 6f  |`abcdefghijklmno|
00000070  70 71 72 73 74 75 76 77  78 79 7a 7b 7c 7d 7e 7f  |pqrstuvwxyz{|}~.|
00000080

查尔斯,

前两个问题回答是,我不理解第三个问题。

byte 类型是 uint8 的别名,后者是无符号8位整数。

我建议你找一本优秀的 Go 入门书籍或视频课程来学习这门语言。

一些推荐:

《Go语言入门》(O’Reilly)- 仅为入门书籍,但易于阅读
Introducing Go
Introducing Go

非常适合熟悉编程基础知识的初学者,这本实践指南提供了对 Google 通用编程语言 Go 的轻松介绍。作者 Caleb Doxsey 涵盖了…

《Go语言实战》(Manning)- 更详细的书籍
Go in Action
Go in Action

一本简洁全面的指南,用于探索、学习和使用 Go。

视频课程 - Go 编程入门和中级 Go 编程(O’Reilly)
Introduction to Go Programming
Introduction to Go Programming

开始使用 Go 编程语言!这个快节奏的视频课程带你从第一个 Go 程序一直到编写高度并发的程序。Go 以其简单的语法而闻名…

Intermediate Go Programming
Intermediate Go Programming

专为熟悉 Go 基础的程序员设计,本课程是《Go 编程入门》之后信息丰富的后续课程。在快速复习基本 Go 语法之后——重点强调…

网络免费书籍:

Go by Example
https://gobyexample.com/

Learning Go
https://www.miek.nl/go/
PDF 版本:https://miek.nl/downloads/2015/go.pdf

Go 编程入门
https://www.golang-book.com/books/intro
(与《Go语言入门》同一作者。这是他的第一本书。)

在Go语言中,函数定义和参数传递与其他语言类似,但有一些语法差异。以下是具体实现方法:

1. 带参数传递的函数定义

package main

import "fmt"

// 基本参数传递
func greet(name string) {
    fmt.Printf("Hello, %s!\n", name)
}

// 多参数传递
func calculate(a int, b int) int {
    return a + b
}

// 可变参数
func sum(numbers ...int) int {
    total := 0
    for _, num := range numbers {
        total += num
    }
    return total
}

func main() {
    // 调用带参数的函数
    greet("Alice")
    
    result := calculate(5, 3)
    fmt.Printf("5 + 3 = %d\n", result)
    
    total := sum(1, 2, 3, 4, 5)
    fmt.Printf("Sum: %d\n", total)
}

2. 数组写入文件的实现

在Go中,数组需要转换为字节切片才能写入文件,可以使用标准库的编码包:

package main

import (
    "encoding/binary"
    "encoding/json"
    "fmt"
    "os"
)

// 方法1:使用binary包将整数数组写入文件
func writeIntArrayToFile(filename string, arr []int) error {
    file, err := os.Create(filename)
    if err != nil {
        return err
    }
    defer file.Close()

    // 将每个整数转换为字节
    for _, value := range arr {
        err := binary.Write(file, binary.LittleEndian, int32(value))
        if err != nil {
            return err
        }
    }
    return nil
}

// 方法2:使用JSON格式写入数组
func writeArrayAsJSON(filename string, arr []int) error {
    file, err := os.Create(filename)
    if err != nil {
        return err
    }
    defer file.Close()

    encoder := json.NewEncoder(file)
    return encoder.Encode(arr)
}

// 方法3:将数组转换为字节切片直接写入
func writeArrayAsBytes(filename string, arr []int) error {
    file, err := os.Create(filename)
    if err != nil {
        return err
    }
    defer file.Close()

    // 将int切片转换为byte切片
    byteSlice := make([]byte, len(arr)*4) // 每个int32占4字节
    for i, v := range arr {
        binary.LittleEndian.PutUint32(byteSlice[i*4:], uint32(v))
    }
    
    _, err = file.Write(byteSlice)
    return err
}

func main() {
    numbers := []int{1, 2, 3, 4, 5, 10, 20, 30}
    
    // 使用不同方法写入文件
    err := writeIntArrayToFile("numbers.bin", numbers)
    if err != nil {
        fmt.Printf("Error writing binary file: %v\n", err)
    }
    
    err = writeArrayAsJSON("numbers.json", numbers)
    if err != nil {
        fmt.Printf("Error writing JSON file: %v\n", err)
    }
    
    err = writeArrayAsBytes("numbers_bytes.bin", numbers)
    if err != nil {
        fmt.Printf("Error writing bytes file: %v\n", err)
    }
    
    fmt.Println("Files created successfully")
}

3. 字符串数组写入文件的示例

package main

import (
    "fmt"
    "os"
    "strings"
)

func writeStringArrayToFile(filename string, arr []string) error {
    file, err := os.Create(filename)
    if err != nil {
        return err
    }
    defer file.Close()

    // 将字符串数组连接并用换行符分隔
    content := strings.Join(arr, "\n")
    _, err = file.WriteString(content)
    return err
}

func main() {
    names := []string{"Alice", "Bob", "Charlie", "Diana"}
    
    err := writeStringArrayToFile("names.txt", names)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        fmt.Println("String array written to file successfully")
    }
}

在Go中,确实需要将数据转换为字节形式才能写入文件,这是由文件I/O的底层实现决定的。标准库提供了多种编码方式(binary、json、gob等)来帮助完成这个转换过程。

回到顶部