Golang中如何将字符串指针作为函数参数使用

Golang中如何将字符串指针作为函数参数使用 我认为这与inx函数的字符串指针参数有关。可能的原因是:sr *string[1000] 请有人能为我指明正确的方向。 谢谢。

package main

import "fmt"

func main() {
	theStr := "ASDSFHHTBBKLKKJHHDFGHJKHHHJHHKJKJJKJKsdkejffkjf43889934ythbnv3ouy4ti3ykfjjvwkjhfwiuiu4ui4uiyruuhfufuiwefhfwekllllllfe34t3gphrepgqhg38po3hgvnfh38t98ohgerqoi084rt3ukovpklmnfvb [gj po 5hop p6iy 904254uy 45uy 45iuuy 45uy 24u209386 34tu 09y0 5u5ty9025y  59u934tp33tgprg nbnvkoiojh1234567iklr,fcv7ytgvb rgb 98uhbrtghnoikjnrfgvyhntghbuik,rfvokmrtg9iuj5rtfychntf8cihjng vf8ihjngvfi hnb jikjgdfkjverohgvoreihjgolerkgoehvve rlkvoijinvn o4erugoerutjblkgfbkdjfnveorijgve;djvboerijvbofdn"

	var (
		iWork         int
		sWork         string
		iRegister2    [1000]uint64
		iRegister4    [1000]uint64
		iRegister8    [1000]uint64
		iRegister16   [1000]uint64
		iRegister32   [1000]uint64
		iRegister64   [1000]uint64
		sRegister2    [1000][2]string
		sRegister4    [1000][4]string
		sRegister8    [1000][8]string
		sRegister16   [1000][16]string
		sRegister32   [1000][32]string
		sRegister64   [1000][64]string
		iInx2         uint32
		iInx4         uint32
		iInx8         uint32
		iInx16        uint32
		iInx32        uint32
		iInx64        uint32
	)
	iWork = 0
	for iWork = 0; iWork < len(theStr); iWork = iWork + 2 {
		if (iWork+2) < len(theStr) {
			sWork = theStr[iWork:iWork+1]
			inx(sWork, &sRegister2, &iRegister2, &iInx2)
		}
		if (iWork+4)%4 == 0 && (iWork+4) < len(theStr) {
			sWork = theStr[iWork:iWork+3]
			inx(sWork, &sRegister4, &iRegister4, &iInx4)
		}
		if ((iWork+8)%8) == 0 && (iWork+8) < len(theStr) {
			sWork = theStr[iWork:iWork+7]
			inx(sWork, &sRegister8, &iRegister8, &iInx8)
		}
		if ((iWork+16)%16) == 0 && (iWork+16) < len(theStr) {
			sWork = theStr[iWork:iWork+15]
			inx(sWork, &sRegister16, &iRegister16, &iInx16)
		}
		if ((iWork+32)%32) == 0 && (iWork+32) < len(theStr) {
			sWork = theStr[iWork:iWork+31]
			inx(sWork, &sRegister32, &iRegister32, &iInx32)
		}
		if ((iWork+64)%64) == 0 && (iWork+64) < len(theStr) {
			sWork = theStr[iWork:iWork+63]
			inx(sWork, &sRegister64, &iRegister64, &iInx64)
		}
	}
	fmt.Printf("2 char array = %d\n", iInx2)
	fmt.Printf("4 char array = %d\n", iInx4)
	fmt.Printf("8 char array = %d\n", iInx8)
	fmt.Printf("16 char array = %d\n", iInx16)
	fmt.Printf("32 char array = %d\n", iInx32)
	fmt.Printf("64 char array = %d\n", iInx64)
}
func inx(s string, sr *string[1000], ir *uint64, ii *uint32) {
	var i int

	for i = 0; i < *ii && (*sr)[i] != s; i++ {
	}
	if i >= *ii {
		(*sr)[i] = append((*sr)[i], s)
		*ii = i
		(*ir)[i]++
	}
}

我遇到了以下错误: ./prog.go:66:6: 缺少函数体 ./prog.go:66:30: 语法错误:意外的 [,期望逗号或 ) ./prog.go:69:2: 语法错误:函数体外部的非声明语句

Go 构建失败。


更多关于Golang中如何将字符串指针作为函数参数使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

指向字符串数组的指针是 *[1000]string,如果我没记错的话。

*[1000]string

更多关于Golang中如何将字符串指针作为函数参数使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,函数参数不能直接声明为固定长度的字符串数组指针。你的代码中 sr *string[1000] 的语法是错误的。正确的做法应该是使用切片或者数组指针,但语法不同。

以下是修正后的代码:

package main

import "fmt"

func main() {
	theStr := "ASDSFHHTBBKLKKJHHDFGHJKHHHJHHKJKJJKJKsdkejffkjf43889934ythbnv3ouy4ti3ykfjjvwkjhfwiuiu4ui4uiyruuhfufuiwefhfwekllllllfe34t3gphrepgqhg38po3hgvnfh38t98ohgerqoi084rt3ukovpklmnfvb [gj po 5hop p6iy 904254uy 45uy 45iuuy 45uy 24u209386 34tu 09y0 5u5ty9025y  59u934tp33tgprg nbnvkoiojh1234567iklr,fcv7ytgvb rgb 98uhbrtghnoikjnrfgvyhntghbuik,rfvokmrtg9iuj5rtfychntf8cihjng vf8ihjngvfi hnb jikjgdfkjverohgvoreihjgolerkgoehvve rlkvoijinvn o4erugoerutjblkgfbkdjfnveorijgve;djvboerijvbofdn"

	var (
		iWork         int
		sWork         string
		iRegister2    [1000]uint64
		iRegister4    [1000]uint64
		iRegister8    [1000]uint64
		iRegister16   [1000]uint64
		iRegister32   [1000]uint64
		iRegister64   [1000]uint64
		sRegister2    [1000][2]string
		sRegister4    [1000][4]string
		sRegister8    [1000][8]string
		sRegister16   [1000][16]string
		sRegister32   [1000][32]string
		sRegister64   [1000][64]string
		iInx2         uint32
		iInx4         uint32
		iInx8         uint32
		iInx16        uint32
		iInx32        uint32
		iInx64        uint32
	)
	iWork = 0
	for iWork = 0; iWork < len(theStr); iWork = iWork + 2 {
		if (iWork+2) < len(theStr) {
			sWork = theStr[iWork:iWork+2]
			inx(sWork, &sRegister2, &iRegister2, &iInx2)
		}
		if (iWork+4)%4 == 0 && (iWork+4) < len(theStr) {
			sWork = theStr[iWork:iWork+4]
			inx(sWork, &sRegister4, &iRegister4, &iInx4)
		}
		if ((iWork+8)%8) == 0 && (iWork+8) < len(theStr) {
			sWork = theStr[iWork:iWork+8]
			inx(sWork, &sRegister8, &iRegister8, &iInx8)
		}
		if ((iWork+16)%16) == 0 && (iWork+16) < len(theStr) {
			sWork = theStr[iWork:iWork+16]
			inx(sWork, &sRegister16, &iRegister16, &iInx16)
		}
		if ((iWork+32)%32) == 0 && (iWork+32) < len(theStr) {
			sWork = theStr[iWork:iWork+32]
			inx(sWork, &sRegister32, &iRegister32, &iInx32)
		}
		if ((iWork+64)%64) == 0 && (iWork+64) < len(theStr) {
			sWork = theStr[iWork:iWork+64]
			inx(sWork, &sRegister64, &iRegister64, &iInx64)
		}
	}
	fmt.Printf("2 char array = %d\n", iInx2)
	fmt.Printf("4 char array = %d\n", iInx4)
	fmt.Printf("8 char array = %d\n", iInx8)
	fmt.Printf("16 char array = %d\n", iInx16)
	fmt.Printf("32 char array = %d\n", iInx32)
	fmt.Printf("64 char array = %d\n", iInx64)
}

func inx(s string, sr *[1000][2]string, ir *[1000]uint64, ii *uint32) {
	var i int

	for i = 0; i < int(*ii) && (*sr)[i][0] != s; i++ {
	}
	if i >= int(*ii) {
		(*sr)[i][0] = s
		*ii = uint32(i + 1)
		(*ir)[i]++
	}
}

主要修改:

  1. 修正函数签名sr *string[1000] 改为 sr *[1000][2]string(对于sRegister2的情况)
  2. 修正字符串切片theStr[iWork:iWork+1] 改为 theStr[iWork:iWork+2]
  3. 修正数组访问(*sr)[i] 改为 (*sr)[i][0]
  4. 修正索引更新*ii = i 改为 *ii = uint32(i + 1)
  5. 修正类型转换:添加 int(*ii) 的类型转换

对于其他大小的数组(4、8、16、32、64),需要创建对应的函数版本,或者使用泛型(Go 1.18+)。以下是使用接口的通用解决方案:

func inxGeneric(s string, sr interface{}, ir interface{}, ii *uint32) {
    switch v := sr.(type) {
    case *[1000][2]string:
        // 处理2字符串数组
        for i := 0; i < int(*ii) && v[i][0] != s; i++ {
        }
        // ... 其他逻辑
    case *[1000][4]string:
        // 处理4字符串数组
    // ... 其他case
    }
}

或者为每种数组大小创建单独的函数:

func inx2(s string, sr *[1000][2]string, ir *[1000]uint64, ii *uint32) {
    // 实现
}

func inx4(s string, sr *[1000][4]string, ir *[1000]uint64, ii *uint32) {
    // 实现
}
// ... 其他函数
回到顶部