Golang中子程序与参数传递的实现方法
Golang中子程序与参数传递的实现方法 你好
如何像在Python等其他语言中那样编写带有参数传递的子程序/函数?
另外,如何将数组写入文件?数组是否必须通过Go库函数转换为字节?
感谢您提供的链接和书籍建议。我在 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():
你好 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
非常适合熟悉编程基础知识的初学者,这本实践指南提供了对 Google 通用编程语言 Go 的轻松介绍。作者 Caleb Doxsey 涵盖了…
《Go语言实战》(Manning)- 更详细的书籍

Go in Action
一本简洁全面的指南,用于探索、学习和使用 Go。
视频课程 - Go 编程入门和中级 Go 编程(O’Reilly)

Introduction to Go Programming
开始使用 Go 编程语言!这个快节奏的视频课程带你从第一个 Go 程序一直到编写高度并发的程序。Go 以其简单的语法而闻名…
专为熟悉 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等)来帮助完成这个转换过程。


